分詞測試
分詞后倒排索引結果:可以通過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)