分词测试
分词后倒排索引结果:可以通过http://127.0.0.1:9200/_analyze 测试
{ "analyzer":"ik_max_word", "text":"我爱广州小蛮腰" }
match匹配
1.match会条件分词去索引里面找 命中一个满足就返回
插入2条测试数据
文档1: 我爱广州小小蛮腰
文档2: 我爱成都
索引 | 文档 |
我 | [文档1,位置0-1][文档2,位置0-1] |
爱 | [文档1,位置1-2][文档2,位置1-2] |
广州 | [文档1,位置2-3] |
小 | [文档1,位置3-4] |
蛮 | [文档1,位置4-5] |
腰 | [文档1,位置5-6] |
成都 | [文档2,位置2-3] |
2.搜索:我爱
默认搜索条件会跟索引一样进行分词 搜索可以指定分词或者指定不分词
我爱分词为 [我:0-1] [爱:1-2] 2个索引都命中
根据索引可以找到文档1,2
3.搜索:我爱我家
分词为:[我:0-1][爱我:1-2][我家:2-3]
[我:0-1] 命中3个文档 则返回三个文档
match_phrase
必须每个索引都命中同时 索引位置相邻才返回
1.搜索我爱命中文档 1 2
2.搜索我爱我家[我:0-1][爱我:1-2][我家:2-3] 虽然前面2个命中第三个没命中 则什么都搜索不出来
什么是索引位置相邻才返回?
比如搜索我爱成都,我们自己换了分词规则 搜索分词变为 [我:0-1][成都:1-2][爱:2-3] 虽然都能命中索引 但是索引位置不相邻 则不会命中
可以使用slop指定跨多少位置 比如以下就是允许跨1个位置 则可以查询出数据
{ "query":{ "match_phrase":{ "productName":{ "query":"我爱我家", "slop":"1" } } } }
项目中遇到搜索不到数据的解决方式
如果出现搜索不出来数据 但是没有 按上面规则来进行判断
1.首先看搜索不出来的文档的分词规则
2.然后测试搜索分词跟他是否一致
使用以下api可以查询到指定文档指定字段的分词结果:
GET /${index}/${type}/${id}/_termvectors?fields=${fields_name}
使用以下api查看搜索结果
get http://127.0.0.1:9200/opcm3/_validate/query?explain
{ "query":{ "match_phrase":{ "productName":{ "query":"纯生" } } } }
{ "valid": true, "_shards": { "total": 1, "successful": 1, "failed": 0 }, "explanations": [ { "index": "opcm3", "valid": true, "explanation": "productName:\"(chun c) (sheng s)\"" } ] }
可以理解为(chun or c) and (sheng or s)