解析Elasticsearch的SearchRequestBuilder的query类型

分词的时机

          对于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: "",
position: 0
},
{
token: "售",
start_offset: 1,
end_offset: 2,
type: "",
position: 1
},
{
token: "管",
start_offset: 2,
end_offset: 3,
type: "",
position: 2
},
{
token: "理",
start_offset: 3,
end_offset: 4,
type: "",
position: 3
}
]
}

如果进行搜索的时候会使用倒排索引的方式进行查找。

使用不同类型的query进行搜索

   1、 termQuery的机制是:直接去匹配token。如上面的分词结果如果是

       termQuery(销售)//无结果token数组不存在
      termQuery(销)//有结果,token数组中存在
     termQuery(售)//有结果token数组中存在

   2、matchQuery的机制是:先检查搜索的字段类型是否是analyzed,如果是,则先使用分词器分词,再去去匹配token;如果查询的字段没有被分词,则直接去匹配token。

      matchQuery(销售)
1、如果查询的'销售' 字段在建索引的适合没有指定not_analyzed,那么会先进行分词在查询。会分为  销  和 售,然后依次进行查询。
2、如果指定了not_analyzed那么将直接使用销售进行查询。


你可能感兴趣的:(elasticsearch)