elasticsearch的實現全文檢索
elasticsearch一個準實時的搜尋引擎,基於lucene構建,它的主要強項還是在全文檢索方面。工作中還是使用到了這部分功能,這裡做一個簡單的總結,可以使初次使用的人很快的配置和使用。
一、全文檢索的概念
首先介紹全文檢索的概念,就是對一篇文章進行索引,可以根據關鍵字搜尋,類似於mysql裡的like語句。
全文索引就是把內容根據詞的意義進行分詞,然後分別建立索引,例如”你們的激情是因為什麼事情來的” 可能會被分詞成:“你們“,”激情“,“什麼事情“,”來“ 等token
這樣當你搜索“你們” 或者 “激情” 都會把這句搜出來。
二、內建分詞器
elasticsearch實現全文索引,首先要確定分詞器,elasticsearch預設有很多分詞器,你可以參考elasticsearch的官方文件。瞭解分詞器主要是怎麼實現的。
你可以使用
curl -XPOST
命令來了解各種分詞器的分詞效果。
{
“token”: “我”,
“start_offset”: 1,
“end_offset”: 2,
“type”: “”,
“position”: 0
}
,
{
“token”: “是”,
“start_offset”: 2,
“end_offset”: 3,
“type”: “”,
“position”: 1
}
,
{
“token”: “中”,
“start_offset”: 3,
“end_offset”: 4,
“type”: “”,
“position”: 2
}
,
{
“token”: “國”,
“start_offset”: 4,
“end_offset”: 5,
“type”: “”,
“position”: 3
}
,
{
“token”: “人”,
“start_offset”: 5,
“end_offset”: 6,
“type”: “”,
“position”: 4
}
三、中文分詞器
一般中文分詞器一般使用第三方的ik分詞器、mmsegf分詞器和paoding分詞器,他們最初可能構建於lucene,後來移植於elasticsearch。 在最新版的elasticsearch,我主要使用了ik分詞器。
我使用的elsaticsearch是2.3.3,elasticsearch和ik分詞的對應版本:
ik分詞的安裝:
去ik分詞的github去下載原始碼用maven編譯:
對應目錄:
IndicesAdminClient indicesAdminClient = client.admin().indices();
AnalyzeAction analyzeAction = AnalyzeAction.INSTANCE;
System.out.println("ik分詞分析:"+"中華人民共和國國歌 ");
AnalyzeRequestBuilder request = new AnalyzeRequestBuilder(indicesAdminClient,analyzeAction,"text" ,"中華人民共和國國歌");
request.setAnalyzer("ik_max_word");
// request.setAnalyzer("ik_smart");
request.setTokenizer("ik");
// Analyzer(分析器)、Tokenizer(分詞器)
List<AnalyzeResponse.AnalyzeToken> listAnalysis = request.execute().actionGet().getTokens();
for( AnalyzeResponse.AnalyzeToken b : listAnalysis ){
System.out.println( b.getTerm() );
}
ik_max_word: 會將文字做最細粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,中華人民,中華,華人,人民共和國,人民,人,民,共和國,共和,和,國國,國歌”,會窮盡各種可能的組合;
ik_smart: 會做最粗粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,國歌”。
可根據需求去選擇所需要的分詞器。