"fuzzy_transpositions" 是否可以在 elasticsearch 的 "multi_match" 查询中设置为 "false"?

Can "fuzzy_transpositions" be set to "false" in a "multi_match" query in elasticsearch?

我一直在搜索,但我不确定在使用 "fuzziness".

时是否可以在 "multi_match" 查询中禁用 "fuzzy_transpositions"

我在使用 "fuzziness" 作为 1 搜索 "games" 时找到 "cam" 的匹配项。

我尝试将 "fuzzy_transpositions" 设置为 false,但仍然匹配。这是我的代码。

{
    function_score: {
        query: {
            bool: {
                must: [
                    [{
                        match: {
                            _id: 7676
                        }
                    }, {
                        term: {
                            store_codes: "de"
                        }
                    }], {
                        bool: {
                            should: [{
                                multi_match: {
                                    fields: ["frontname.*"],
                                    query: "games"
                                }
                            }, {
                                multi_match: {
                                    fields: ["frontname.*"],
                                    query: "games",
                                    fuzziness: "1",
                                    fuzzy_transpositions: false
                                }
                            }],
                            minimum_should_match: 1
                        }
                    }
                ]
            }
        },
        functions: [{
            gauss: {
                rank: {
                    origin: 200,
                    scale: 100
                }
            }
        }],
        score_mode: "sum"
    }
}

fuzzy transposition与你拥有的无关。它不适用于您的情况。正如 link 中提到的,它解决了一个场景,如果您的查询是 ab,它会 return transposed 结果,即 ba

我尝试了您提到的场景,据我了解,您可能正在为您的字段使用 Ngram or Edge ngram 分词器。

如 Edge Ngram link 中所述,假设我们有以下映射:

PUT my_fuzzy_index
{  
   "mappings":{  
      "mydocs":{  
         "properties":{  
            "title":{  
               "type":"text",
               "analyzer":"my_analyzer"
            },
            "desc":{  
               "type":"text",
               "analyzer":"my_analyzer"
            }
         }
      }
   },
   "settings":{  
      "analysis":{  
         "analyzer":{  
            "my_analyzer":{  
               "tokenizer":"my_tokenizer"
            }
         },
         "tokenizer":{  
            "my_tokenizer":{  
               "type":"edge_ngram",
               "min_gram":2,
               "max_gram":5,
               "token_chars":[  
                  "letter",
                  "digit"
               ]
            }
         }
      }
   }
}

让我们现在执行下面的 Analyze 查询:

POST my_fuzzy_index/_analyze
{
  "analyzer": "my_analyzer", 
  "text": "games"
}

执行此操作时,您可以在响应中看到将创建以下令牌。这意味着您的倒排索引将包含以下单词。

ga, gam, game, games

现在,如果您使用 fuzziness: 1 的内容进行搜索,它实际上会在查询时应用 相同的分析器 ,这意味着它也会 return 以上标记及其模糊兄弟姐妹的编辑距离为 1 的结果(gam 并且编辑距离为 1,它也会 return cam)。

您可以在搜索查询中使用 standard analyzer,如下所示,但请注意模糊性仍在应用,例如如果您的查询是 games,它将 return 结果为 james,因为 fuzziness 设置为 1,但它将取消搜索小于 n-1 你查询的长度。

POST my_fuzzy_index/_search
{
  "query": {
    "multi_match": {
      "query": "games",
      "fields": ["*"],
      "fuzziness": 1,
      "analyzer": "standard"            <---- this field here
    }
  }
}

如果您正在寻找的是 return 类似的结果,例如喜欢 game, games, gaming 然后跳过模糊搜索的概念并利用 Stemmer.

的概念

使用模糊性的全部目的是向您展示某些非常规的结果,例如管理拼写错误,根据 usernames/product 代码进行搜索等。因此基本上您所观察到的内容按照模糊性的定义正常工作。 link 应该可以帮助您更多地了解模糊性。

希望对您有所帮助!