Elasticsearch学习之SearchRequestBuilder的query类型

1. 分词的时机

  对于ES来讲,可以对文档的内容进行分词(前提是设置了analyzed),也可以对输入的搜索词进行分词。对输入的搜索词进行分词时需要看下使用的什么类型的query。不同的query可能会对词进行分词,也可能不分词。无论是文档分词还是搜索词分词,依赖于使用的是什么分词器。分词的结果和分词规则(假设使用的是默认的standard),去掉大部分标点符号,并以此分割原词为多个词,把分分割后的词转为小写(汉字的话分完的结果)放入token组中,对于not-analyzed的词,直接把原词放入token组中。如下所示:

http://192.168.1.114:9200/_analyze?pretty&analyzer=standard&text=销售管理,结果:

{  
    tokens: [  
        {  
            token: "",  
            start_offset: 0,  
            end_offset: 1,  
            type: "<IDEOGRAPHIC>",  
            position: 0  
        },  
        {  
            token: "",  
            start_offset: 1,  
            end_offset: 2,  
            type: "<IDEOGRAPHIC>",  
            position: 1  
        },  
        {  
            token: "",  
            start_offset: 2,  
            end_offset: 3,  
            type: "<IDEOGRAPHIC>",  
            position: 2  
        },  
        {  
            token: "",  
            start_offset: 3,  
            end_offset: 4,  
            type: "<IDEOGRAPHIC>",  
            position: 3  
        }  
    ]  
}  

如果进行搜索的时候会使用倒排索引的方式进行查找。
使用不同类型的query进行搜索
1. termQuery的机制是:直接去匹配token,如上面的分词结果如果是
  termQuery(销售)//无结果,token数组不存在
  termQuery(销)//  有结果,token数组中存在
  termQuery(售)//  有结果,token数组中存在
2. matchQuery的机制是:先检查搜索的字段类型是否是analyzed,如果是,则先使用分词器分词,再去去匹配token;如果查询的字段没有被分词,则直接去匹配token。
  matchQuery(销售)
  2.1 如果查询的'销售' 字段在建索引的时候没有指定not_analyzed,那么会先进行分词在查询。会分为'销'和'售',然后依次进行查询。
  2.2 如果指定了not_analyzed,那么将直接使用'销售'进行查询。

原文地址:https://www.cnblogs.com/sunfie/p/9030372.html