elasticsearch-搜索-match和match_phrase匹配原理(四)


分詞測試

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM