日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

solr入门学习

發布時間:2024/9/27 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 solr入门学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Tomcat7,solr3.6,mmseg1.8

1:環境的搭建

1:解壓tomcat,solr,mmseg4j

2:復制dist文件夾下apache-solr.war到tomcat的webapp文件夾下,修改文件名為solr(不該也行,這里修改文件名方便一會地址欄的輸入)

3:創建solr-tomcat文件夾作為solr的根目錄

4:tomcat/conf/Catalina/localhost文件夾(不存在手動創建)下創建solr.xml,文件內容如下,根據情況,修改相應的路徑

<Context docBase="E:/tomcat7/apache-tomcat-7.0.19/webapps/solr" reloadable="true" >

<Environment name="solr/home" type="java.lang.String" value="E:/solr-tomcat" override="true" />

</Context>

5:復制solr解壓后,example文件夾下的solr文件夾到solr-tomcat文件夾下

6:訪問http://localhost:8080/solr/,驗證是否配置成功(訪問后,solr-tomcat/solr文件夾下會多一個data文件夾)

?

2:配置文件的說明

1:apache-tomcat-7.0.19\conf\Catalina\localhost\solr.xml文件,用來配置solr的根目錄,目前只用到一次

2:E:\solr-tomcat\solr\solr.xml文件,目前只看到在配置多核時用到,后面講

3:E:\solr-tomcat\solr\conf\schema.xml文件(非常重要)

<fieldType name="string" class="solr.StrField" sortMissingLast="true" />配置域的類型

<field name="name" type="text_general" indexed="true" stored="true"/>配置域,在doc文檔中的用到的field和solrj中用到的域名必須在這里配置。Index表示是否需要索引,stored是否需要存儲,multiValued表示是否有多個值

<dynamicField name="*_s"?type="string"?indexed="true"?stored="true"/>就是動態匹配

<copyField source="name" dest="text"/>在搜索時可以直接通過“zhang san”來搜索那么,不需要在通過“name:zhang san”來搜索

4:E:\solr-tomcat\solr\conf\solrconfig.xml文件:緩存,請求的配置,索引的配置

?

3:瀏覽器客戶端的說明

Solr->analyze:分詞

Query String:根據索引搜索時用。eg:name:zhang san可以通過name來搜索姓名是zhang san的人。如果配置了copyField也可以直接通過zhang san來搜索

?

4:中文分詞的配置

1:解壓mmseg4j,拷貝mmseg4j-all-1.8.5.jar到tomcat\webapp\solr的lib目錄下

2:solr-tomcat\solr下創建dic文件夾,存放詞庫;拷貝mmseg4j下的words.dic到該目錄下

3:修改schema.xml文件,添加如下代碼(注意修改路徑)

<!--mmseg4j field types-->

<fieldType name="textComplex" class="solr.TextField" positionIncrementGap="100" >

<analyzer>

<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="E:/solr-tomcat/solr/dic"/>

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

<fieldType name="textMaxWord" class="solr.TextField" positionIncrementGap="100" >

<analyzer>

<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="E:/solr-tomcat/solr/dic"/>

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

<fieldType name="textSimple" class="solr.TextField" positionIncrementGap="100" >

<analyzer>

<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="E:/solr-tomcat/solr/dic"/>

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

?

?

<field name="simple" type="textSimple" indexed="true" stored="true" multiValued="true"/>

<field name="complex" type="textComplex" indexed="true" stored="true" multiValued="true"/>

<field name="text" type="textMaxWord" indexed="true" stored="true" multiValued="true"/>

?

<copyField source="simple" dest="text"/>

<copyField source="complex" dest="text"/>

4:測試中文分詞是否起作用

復制一段中文到Field value中;Field選擇name輸入complex,測試分詞

name在使用name(沒有配置中文分詞,使用默認的)再次進行測試

?

?

5:多核的配置

1:拷貝example\multicore文件夾下的core0,core1,solr.xml到solr-tomcat\solr文件夾下

2:方位http://localhost:8080/solr/

?

?

?

?

?

使用瀏覽器客戶端創建索引,搜索

4:創建索引(xml,json,cvs格式的文件cookbook)

1:復制solr解壓后的,example文件夾下的exampledocs目錄到solr-tomcat下(里面包含了一些測試索引用到的文件)

2:命令行創建索引:E:\solr-tomcat\exampledocs>java -Durl=http://localhost:8080/solr/update -Dcommit=yes -jar post.jar m*.xml,對該文件夾下所有以m開頭的xml文件創建索引,此時solr-tomcat\solr\data文件夾下多了一些文件,有段文件,域文件,索引文件等

3:通過瀏覽器進行搜索,必須通過一個完整的分詞(一個完整的單詞,不能用a,m,z等搜索,同時this,that等也不能用于搜索)

?

5:更新索引

更新索引一般都是通過刪除索引,然后再創建

6:刪除索引

Solrj的使用

http://wiki.apache.org/solr/Solrj

private?static?final?String?DEFAULT_URL?=?"http://localhost:8080/solr/";

1:創建索引(如何對一個指定格式的xml創建索引還不清楚)

對文件進行索引

public?void?index()?throws?SolrServerException, IOException {

SolrServer solrServer =?new?HttpSolrServer(DEFAULT_URL);

SolrInputDocument document =?new?SolrInputDocument();

document.addField("id",?"1");?//id必須有

document.addField("name",?"test");

document.addField("path",?"測試");?//path需要在schema.xml中定義

solrServer.add(document);

solrServer.commit();

}

對Bean進行索引

public?class?SolrItem?{

/**

* id,對應Solr中記錄的Id

*/

@Field("id")

public?String?id;

?

/**

*?員工姓名

*/

@Field("title")

public?String?empName;

?

/**

*?員工郵箱

*/

@Field("subject")

public?String?email;

?

...

}

?

public?void?index()?throws?SolrServerException, IOException {

SolrItem item =?new?SolrItem();

item.setId("1");

item.setEmpName("張三");

item.setEmail("test@ppstream.com");

solrServer.addBean(item);

solrServer.commit();

}

?

?

2:搜索

public?void?query(String query) {

SolrParams params =?new?SolrQuery(query);

try?{

QueryResponse response =?solrServer.query(params);

SolrDocumentList?list = response.getResults();

for?(int?i = 0; i < list.size(); i++) {

fail(list.get(i));

}

}?catch?(SolrServerException e) {

e.printStackTrace();

}

}

?

3:刪除索引

public?void?delete(String params)?throws?SolrServerException, IOException {

solrServer.deleteByQuery(params);

//solrServer.deleteById(params);

}

?

?

4:高亮顯示

public?SolrDocumentList query(String str) {

SolrQuery query =?new?SolrQuery(str);

?

//設置高亮,以下兩種方式都行(相當于開啟高亮功能)

//query.setHighlight(true);

query.setParam("hl",?"true");?//highlighting

?

//設置高亮顯示的請求,高亮顯示的內容由該參數決定,但是返回結果還是由SolrQuery決定

//query.setParam("hl.q", "email:zhang@ppstream.com");

?

/*

*?那些字段高亮顯示,可以用空格或者逗號分隔(有一個域的時候正常,兩個及以上沒測試通過)

*?老版本使用query.addHighlightField("name");query.addHighlightField("description");給多個字段開啟高亮功能

*/

query.setParam("hl.fl",?"name");

?

//高亮顯示字段前后添加html代碼

query.setHighlightSimplePre("<font color=\"red\">");

query.setHighlightSimplePost("</font>");

?

SolrDocumentList list =?new?SolrDocumentList();

SolrDocument document =?null;

?

QueryResponse response=new?QueryResponse();

try?{

SolrDocumentList documents = response.getResults();

//第一個Map的鍵是文檔的ID,第二個Map的鍵是高亮顯示的字段名

Map<String, Map<String,?List<String>>> map = response.getHighlighting();

?

for(int?i=0;i<documents.size();i++) {

document = documents.get(i);

document.setField("name", map.get(document.getFieldValue("id")).get("name"));

/*document.setField("email", map.get(document.getFieldValue("id")).get("email"));*/

list.add(document);

}

}?catch?(Exception e) {

?

}

return?list;

}

?

?

Solr的其他應用

1:對一篇文章的前100個分詞字創建索引

有時可能需要對某個字段(文章的內容content)的前1000個字符創建索引并存儲,可以在solrconfig.xml中添加<maxFieldLength>1000</maxFieldLength>實現(默認是1萬)。這里是分詞數量,不是漢字或字母的個數。

?

2:配置中文分詞后,如果查詢“java編程思想”,會自動拆分成java,編程,思想3個分詞依次進行查找

?

3:多條件查詢

可以通過“編程?AND empName:XXX”進行查詢,或者“編程?OR empName:XXX”等

?

4:字段當做一個整體,不進行分詞

如果某個字段不需要使用分詞,eg:java編程思想,只有在輸入完成的書名:java編程思想才會搜索出來,可以在書名字段上的type使用不帶分詞的類型(schema.xml中配置)

?

5:檢索索引中的部分字段

有時索引中可能存放很多信息,eg:書名,作者,出版時間,ISBN…….;在某次查詢中,我們只需要搜索結果書名和作者即可。可以通過如下方式實現

SolrQuery query =?new?SolrQuery(param);

???//返回的結果

???String[] str = {"title",?"author"};

query.setFields(str);

?

6:Solr的分頁

?????????SolrQuery query =?new?SolrQuery("*:* AND (empName:XXX OR empName:XX)");

????query.setHighlight(true);

????query.setStart(0);

????query.setRows(2);

????QueryResponse response =?solrServer.query(query);

????long?totalCount?= response.getResults().getNumFound();

?totalCount返回的是滿足條件的總記錄條數,并不一定是0或2

?

7:solrj高亮顯示時,只顯示字段部分內容

SolrDocumentList?list?= response.getResults();

???Map<String, Map<String, List<String>>>?map?= response.getHighlighting();

???//對應的高亮字段(假設是content)。在list中顯示正確,map中顯示的只是content中的一部分。

???query.setHighlightFragsize(100000);?//可以通過這種方法改變,設置一個比list中,對應content內容大的數字

query.setHighlightSnippets(0);//或者設置高亮片段為0,這樣關鍵字也就不會在高亮顯示

?

8:搜索條件的部分關鍵字高亮顯示

有時我們查詢根據條件“java OR (empId:1000 AND empId:1001)”搜索時,結果如果高亮顯示,可能出現1000,1001數字也會高亮,但是我們只希望java關鍵字高亮,這個時候可以用下面的方法

???query.setParam("hl.q",?"lucene solr");只對lucene和solr關鍵字進行高亮顯示(solr不作為搜索條件也可以)

?

?

9:顯示第一個匹配關鍵字附近的部分內容

???有時我們需要顯示檢索出內容的一部分(在列表頁,只需要顯示一個概要信息),這時候可以通過設置query.setHighlightFragsize(100000);的大小來控制

?

10:schema文件,copyField配置

<!--?感覺使用copyField的作用是。

????????????????1:不需要在輸入title:XXX,只需簡單XXX即可查詢

????????????????2:將title,content中輸入的內容全部放到text一個字段上進行,可以簡化查詢不需要過多的判斷

????????????????3:需要注意的是:source對應域的類型要和dest域對應的類型相兼容

????-->

????<copyField source="title" dest="complex"/>

????<copyField source="content" dest="complex"/>

?

?

?

?

?

11:自動補全

搜索時在title和content上進行搜索,所以自動補全時要在title和content上同時進行。但是自動補全只能在一個字段上進行(目前我知道這樣),所以就創建一個新字段searchField=title+”,”+content用來進行自動補全的提示,該字段僅用來索引不需要存儲。

SolrQuery query =?new?SolrQuery(q);?

query.addTermsField(searchField);

query.setTerms(true);?

query.setTermsLimit(limit);?

query.setTermsLower(pre);?

query.setTermsPrefix(pre);

query.setQueryType("/terms");

?

QueryResponse qr =?solrServer.query(query);

???????TermsResponse resp = qr.getTermsResponse();

?List<Term> list = resp.getTerms(searchField);

這種搜索存在的問題:

1:?q:empName:XXX AND projecteId:19????pre:lucen???在搜索時,返回的TermsResponse結果只應用了pre一個條件

2:?title,content無法配置copyField字段使用complex(原因及解決辦法沒找到)

?

解決方法:改用Facet替換Term

SolrQuery query =?new?SolrQuery(q);

?

????????query.setFacet(true);

????????query.addFacetField(searchField);

????????query.setFacetLimit(limit);

????????query.setFacetPrefix(pre);

?

????????QueryResponse qr =?solrServer.query(query);

????????List<FacetField> fss = qr.getFacetFields();

????????FacetField ff = fss.get(0);

??return?ff.getValues();

??返回的fss結果仍然是根據pre一個條件返回的結果集,但是不滿足條件query的結果集中,對應的count為0,即出現了0次

?

12:solr刪除索引后,索引文件還存在,但是搜索結果已經不存在

?

?

13:添加tomcat驗證,防止用戶直接通過地址欄訪問solr,進行修改刪除索引

???1:修改tomcat-user.xml文件

<role rolename="tomcat"/>

??<role rolename="role1"/>

??<role rolename="manager"/>

??<role rolename="admin"/>

??<role rolename="manager-gui"/>

??<user username="tomcat" password="tomcat" roles="tomcat"/>

??<user username="both" password="tomcat" roles="tomcat,role1"/>

??<user username="role1" password="tomcat" roles="role1"/>

??<user username="zhchx" password="zhchx" roles="admin,manager,manager-gui"/>

2:修改solr的web.xml文件,添加如下代碼,對所有的請求,都需要tomcat用戶及密碼的驗證

<security-constraint>

???????<web-resource-collection>

???????????<web-resource-name>solr</web-resource-name>

???????????<url-pattern>/*</url-pattern>

???????????<http-method>GET</http-method>

???????????<http-method>POST</http-method>

???????</web-resource-collection>

???????<auth-constraint>

???????????<description>This applies only to the "tomcat" security role</description>

???????????<role-name>admin</role-name>

???????</auth-constraint>

???</security-constraint>

?

???<login-config>

???????<auth-method>BASIC</auth-method>

???</login-config>

???<security-role>

???????<role-name>admin</role-name>

???</security-role>

3:使用該方法后,通過solrj也不能直接訪問,修改如下

String url = PropertiesSon.getText("solr.serverUrl");

????????????String username = PropertiesSon.getText("solr.username");

????????????String password = PropertiesSon.getText("solr.password");

????????????String host = PropertiesSon.getText("solr.host");

????????????int?port = Integer.parseInt(PropertiesSon.getText("solr.port"));

???????????

????????????DefaultHttpClient httpclient =?new?DefaultHttpClient();

????????????httpclient.getCredentialsProvider().setCredentials(

????????????????????new?AuthScope(host, port),

????????????????????new?UsernamePasswordCredentials(username, password));

?

????????????solrServer?=?new?HttpSolrServer(url, httpclient);

4:使用該方法創建時,刪除添加索引報錯“Cannot retry request with a non-repeatable request entity.

修改方法:url用http://username:password@10.1.11.165:8081/solr取代http://10.1.20.57:8081/solr(httpclient使用?4.2是時正常,使用4.1時,在刪除新增索引仍然會報上面的錯誤)

?

總結

以上是生活随笔為你收集整理的solr入门学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美交 | 国产精品伦一区二区三级视频 | 亚洲小说春色综合另类 | 91性| 欧美乱码视频 | 丁香五香天堂网 | 天天躁夜夜躁狠狠是什么心态 | 爱如潮水3免费观看日本高清 | 日韩av片在线播放 | 亚洲激情免费 | 一本色道久久综合狠狠躁的推荐 | 老熟女高潮一区二区三区 | 成年人在线视频网站 | 一级美女大片 | 久久精品毛片 | 三上悠亚在线观看一区二区 | 国产精品国产三级国产aⅴ浪潮 | 欧洲美一区二区三区亚洲 | 都市激情综合 | 婷婷色在线观看 | 精品国产96亚洲一区二区三区 | 国产理论影院 | 日本少妇高潮 | 中文字幕一区二区三区乱码在线 | 午夜天堂精品久久久久 | 国产剧情在线 | 亚洲日本影院 | 视频在线免费观看 | 青草热视频 | 亚洲综合精品国产一区二区三区 | 少妇欧美激情一区二区三区 | 久久a久久 | 久久久经典 | 黄色特级网站 | 天天爽夜夜爽夜夜爽 | 亚洲无线观看 | 精品国产一级片 | 在线1区| 禁果av一区二区三区 | 六月激情网| 中文精品在线观看 | 亚洲 欧美 视频 | 精品国产鲁一鲁一区二区张丽 | 久久久久久久国产精品视频 | 亚洲图片欧美 | 久久久精品免费视频 | 日韩精品成人无码专区免费 | se综合| 久久系列 | 亚洲熟女www一区二区三区 | av大片网址 | 在线看片中文字幕 | 国产av无码专区亚洲av毛片搜 | 好男人天堂网 | 蜜桃导航-精品导航 | jizzjizz国产 | 久久亚洲精品中文字幕 | aa在线视频 | 精品人妻码一区二区三区红楼视频 | 日韩欧美一区二区在线 | 手机在线中文字幕 | 国产一区91| 亚洲天堂女人 | 天天操一操| 国产一区二区三区精品在线观看 | 国产二区一区 | 久久综合精品视频 | 91丝袜一区二区三区 | 美女少妇毛片 | 天天色天天插 | 国产亚洲精品成人av在线 | 亚洲国产一区二区在线 | 青青草官网 | 毛茸茸日本熟妇高潮 | 国产精品一卡二卡 | avtt一区 | 在线免费观看黄网站 | 免费看裸体网站视频 | 天天干人人 | www.youjizz.com视频 | 美女搞黄在线观看 | 精品动漫av | 天堂网av2018| 污污视频在线免费看 | www.亚洲国产 | 一级性毛片| 毛茸茸日本熟妇高潮 | 综合久久精品 | 日日草天天干 | 日本黄色播放器 | 亚洲一区二区色图 | 亚洲伊人av | 亚洲成人av免费观看 | 国毛片 | 午夜蜜桃视频 | 免费人成在线观看视频播放 | 久久久久久久久久影视 | 国产精品一品二品 | 熊猫电影yy8y全部免费观看 |