可以在Elasticsearch的“ multi_match”查询中将“ fuzzy_transpositions”设置为“ false”吗?

时间:2019-04-11 16:12:33

标签: elasticsearch fuzzy-search

我一直在搜索,但是不确定使用“ fuzziness”时是否可以在“ multi_match”查询中禁用“ fuzzy_transpositions”。

在使用“模糊性”作为1搜索“游戏”时,我找到了“ 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"
    }
}

1 个答案:

答案 0 :(得分:0)

fuzzy transposition与您所拥有的无关。它不适用于您的情况。如链接中所述,它解决了以下情况:如果您的查询为ab,它将返回转置的结果,即ba

我尝试了您提到的场景,据我了解,您可能在字段中使用NgramEdge ngram标记程序。

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

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进行搜索,实际上它会在查询时应用同一分析器,这意味着它还会返回上述令牌及其模糊结果编辑距离为1(gam,编辑距离为1的兄弟姐妹,也将返回cam)。

可能的是,在下面的搜索查询中使用standard analyzer,但是请注意,模糊性仍在应用,例如如果您的查询为james,并且games设置为fuzziness,则它将返回包含单词1的结果,但是它将消除搜索小于 n- 1 您的查询长度。

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

如果您要查找的是返回类似的结果,例如像game, games, gaming一样,然后跳过模糊搜索的概念,而使用Stemmer的概念。

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

希望这会有所帮助!