#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
#3. solr 默認的web容器:jetty #4. 配置經過域名訪問solrweb
127.0.0.1 solr.taotao.com
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>
<str name="df">text</str>
替換成<str name="df">title</str>
<searchComponent name="elevator" class="solr.QueryElevationComponent" >
註釋掉(這個的功能相似百度的競價排名)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>
<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; }
注意點:
field:key
如:title:java
.AND
和OR
必定大寫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. 性能優化