elasticsearch一个准实时的搜索引擎,基于lucene构建,它的主要强项还是在全文检索方面。工作中还是使用到了这部分功能,这里做一个简单的总结,可以使初次使用的人很快的配置和使用。

一、全文检索的概念

首先介绍全文检索的概念,就是对一篇文章进行索引,可以根据关键字搜索,类似于mysql里的like语句。

全文索引就是把内容根据词的意义进行分词,然后分别创建索引,例如”你们的激情是因为什么事情来的” 可能会被分词成:“你们“,”激情“,“什么事情“,”来“ 等token

这样当你搜索“你们” 或者 “激情” 都会把这句搜出来。

二、内置分词器

elasticsearch实现全文索引,首先要确定分词器,elasticsearch默认有很多分词器,你可以参考elasticsearch的官方文档。了解分词器主要是怎么实现的。

你可以使用

curl -XPOST http://192.168.0.23:9200/fenci/_analyze?analyzer=standard&pretty=true&text=“我是中国人”

命令来了解各种分词器的分词效果。

{ 
 “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分词的对应版本:

es全文检索java源码 es做全文检索_全文检索


ik分词的安装:

去ik分词的github去下载源码用maven编译:

对应目录:

es全文检索java源码 es做全文检索_elasticsearch_02

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: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;

es全文检索java源码 es做全文检索_es全文检索java源码_03


ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。

es全文检索java源码 es做全文检索_分词器_04


可根据需求去选择所需要的分词器。