taotao系統中使用solr筆記

solr

#1. solr的安裝 1.1 解壓文件solr-4.10.2.zip 1.2 進入C:\solr-4.10.2\example 1.3 運行命令:java -jar start.jar 1.4 打開瀏覽器,輸入地址:http://localhost:8983/solr/java

#2. solr功能簡介nginx

  1. Dashboard 顯示系統信息
  2. Logging 日誌信息
  3. Core Admin 核心管理
  4. Java Properties Java運行參數
  5. Thread Dump 線程副本
  6. core 相關功能
  • Overview 概覽信息
  • Analysis 分析分詞
  • Dataimport 數據導入
  • Document 數據
  • Files 文件
  • Ping 相應速度
  • Plugins/Stats 插件
  • Query 查詢
  • Replication 複製
  • Schema Browser 定義結構瀏覽

#3. solr 默認的web容器:jetty #4. 配置經過域名訪問solrweb

  • 修改hosts文件,添加127.0.0.1 solr.taotao.com
  • 配置nginx
server	{
		#1.偵聽80端口
		listen	80;
		server_name	solr.taotao.com;
		proxy_set_header Host $host;

		proxy_set_header X-Forward-Host	 $host;
		proxy_set_header X-Forward-Server	$host;
		proxy_set_header X-Forward-For	$proxy_add_x_forwarded_for;

		location /{
		proxy_pass http://127.0.0.1:8983;
		proxy_connect_timeout	600;
		proxy_read_timeout	600;
		}
	}
  • 修改solr-4.10.2\example\contexts\solr-jetty-context.xml <Set name="contextPath"><SystemProperty name="hostContext" default="/solr"/></Set> 替換爲 <Set name="contextPath"><SystemProperty name="hostContext" default="/"/></Set>

#5. solr的web目錄 - solr:存放core - solr-webapp 運行的web服務 - start.jar 啓動solr服務的jar(java -jar start.jar)apache

#6. 建立taotao core core是solr中最爲重要的一個概念,solr應用能夠部署多個core.每一個core包含2個目錄,conf和data,分別用於存放配置文件和數據.core的核心配置文件有2個.solrconfig.xml和schema.xml,分別用於solr的配置以及數據格式定義. 1) 建立taotao-solr - 在example目錄下建立taotao-solr文件夾 - 將./solr下的solr.xml拷貝到taotao-solr目錄下 - 在taotao-solr下建立taotao目錄,而且在taotao目錄下建立conf和data目錄 - 將example\solr\collection1\core.properties文件拷貝到example\taotao-solr\taotao下,而且修改name=taotao - 將example\solr\collection1\conf下的schema.xml、solrconfig.xml拷貝到example\taotao-solr\taotao\conf下 - 修改schema.xml文件,使其配置最小化瀏覽器

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.5">
	<field name="_version_" type="long" indexed="true" stored="true"/>
	<field name="_root_" type="string" indexed="true" stored="false"/>
	<field name="id" type="long" indexed="true" stored="true" required="true" multiValued="false"/>
	<field name="title" type="string" indexed="true" stored="true" required="true" multiValued="false"/>
	<uniqueKey>id</uniqueKey>
	<fieldType name="string" class="solr.StrField" sortMissingLast="true"/>
	<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
</schema>
  1. 修改solrconfig.xml文件,修改一些配置,大部分配置先保持默認
  • 將全部的<lib>標籤註釋掉
  • 搜索<str name="df">text</str>替換成<str name="df">title</str>
  • <searchComponent name="elevator" class="solr.QueryElevationComponent" >註釋掉(這個的功能相似百度的競價排名)
  1. 啓動solr java -Dsolr.solr.home=taotao-solr -jar start.jar

#7. 集成IKAnalyzer中文分詞器 1) 將IKAnalyzer-2012-4x.jar拷貝到example\solr-webapp\webapp\WEB-INF\lib下 2) 在schema.xml文件中添加fieldType性能優化

<fieldType name="text_ik" class="solr.TextField">
     <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
  1. <field name="title" type="string" indexed="true" stored="true" required="true" multiValued="false"/>中的string換成text_ik

#8. solrj solrj是solr的java客戶端,通常狀況下都是經過solrj來調用solr服務. 導入依賴:app

<dependency>
	<groupId>org.apache.solr</groupId>
	<artifactId>solr-solrj</artifactId>
	<version>4.10.1</version>
</dependency>

測試 1). setUp()webapp

@Before
	public void setUp() throws Exception {
		// 在url中指定core名稱:taotao
		// http://solr.taotao.com/#/taotao地址是solr控制檯的url
		// http://solr.taotao.com/taotao地址是solrj操做solr的接口地址
		String url = "http://solr.taotao.com/taotao";
		HttpSolrServer httpSolrServer = new HttpSolrServer(url); // 定義solr的server
		httpSolrServer.setParser(new XMLResponseParser()); // 設置響應解析器
		httpSolrServer.setMaxRetries(1); // 設置重試次數,推薦設置爲1
		httpSolrServer.setConnectionTimeout(500); // 創建鏈接的最長時間

		this.httpSolrServer = httpSolrServer;
		solrjService = new SolrjService(httpSolrServer);
	}

2). add性能

@Test
	public void testAdd() throws Exception {
		Foo foo = new Foo();
		// foo.setId(System.currentTimeMillis());
		foo.setTitle("輕量級企業Java應用實戰(第3版):Struts2+Spring3+Hibernate(JAVA)整合開發(附CD光盤)java");
		foo.setId(1481722460050l);
		this.solrjService.add(foo);

		foo.setId(1446948087657l);
		this.solrjService.add(foo);

		foo.setId(1481722517441l);
		this.solrjService.add(foo);

		foo.setId(1481722521468l);
		this.solrjService.add(foo);
		// 1481722460050
		// 1446948087657
		// 1481722517441
		// 1481722521468

	}

3). update(根據主鍵判斷是否存在,若是存在就更新,不然插入)測試

@Test
	public void testUpdate() throws Exception {
		Foo foo = new Foo();
		foo.setId(1446948087657l);
		foo.setTitle("new -輕量級Java EE企業應用實戰(第3版):Struts2+Spring3+Hibernate整合開發(附CD光盤)java 個人Java");

		this.solrjService.add(foo);
	}

4). delete

@Test
	public void testDelete() throws Exception {
		this.solrjService.delete(Arrays.asList("1481722460050"));
	}

5). search

@Test
	public void testSearch() throws Exception {
		List<Foo> foos = this.solrjService.search("java", 1, 10);
		for (Foo foo : foos) {
			System.out.println(foo);
		}
	}

其中search的具體實現是:

public List<Foo> search(String keywords, Integer page, Integer rows) throws Exception {
			SolrQuery solrQuery = new SolrQuery(); //構造搜索條件
			solrQuery.setQuery("title:" + keywords); //搜索關鍵詞
			// 設置分頁 start=0就是從0開始,,rows=5當前返回5條記錄,第二頁就是變化start這個值爲5就能夠了。
			solrQuery.setStart((Math.max(page, 1) - 1) * rows);
			solrQuery.setRows(rows);

			//是否須要高亮
			boolean isHighlighting = !StringUtils.equals("*", keywords) && StringUtils.isNotEmpty(keywords);

			if (isHighlighting) {
				// 設置高亮
				solrQuery.setHighlight(true); // 開啓高亮組件
				solrQuery.addHighlightField("title");// 高亮字段
				solrQuery.setHighlightSimplePre("<em>");// 標記,高亮關鍵字前綴
				solrQuery.setHighlightSimplePost("</em>");// 後綴
			}

			// 執行查詢
			QueryResponse queryResponse = this.httpSolrServer.query(solrQuery);
			List<Foo> foos = queryResponse.getBeans(Foo.class);
			if (isHighlighting) {
				// 將高亮的標題數據寫回到數據對象中
				Map<String, Map<String, List<String>>> map = queryResponse.getHighlighting();
				for (Map.Entry<String, Map<String, List<String>>> highlighting : map.entrySet()) {
					for (Foo foo : foos) {
						if (!highlighting.getKey().equals(foo.getId().toString())) {
							continue;
						}
						foo.setTitle(StringUtils.join(highlighting.getValue().get("title"), ""));
						break;
					}
				}
			}

			return foos;
		}

注意點:

  • solr的查新語法是 field:key 如:title:java.
  • 若是使用ANDOR 必定大寫
  • 默認搜索字段.在solrconfig.xml中的df值在定義
<requestHandler name="/select" class="solr.SearchHandler">
    <!-- default values for query parameters can be specified, these
         will be overridden by parameters in the request
      -->
     <lst name="defaults">
       <str name="echoParams">explicit</str>
       <int name="rows">10</int>
       <str name="df">title</str>
     </lst>

6). deleteByQuery

@Test
	public void testDeleteByQuery() throws Exception {
		httpSolrServer.deleteByQuery("*:*");
		httpSolrServer.commit();
	}

#9. 性能優化

  • 將全部只用於搜索的,而不須要做爲結果的field(特別是一些比較大的field)stored值設置爲false
  • 將不要被用於搜索的,而只是做爲結果返回的field的indexed設置爲false
  • 刪除全部沒必要要的copyField聲明爲了索引字段的最小化和搜索的效率
  • 將全部的textField的indexed設置成false,而後使用copyField將他們都複製到一個總的textField上,而後進行搜索.
相關文章
相關標籤/搜索