我一直在搜索,但是不确定使用“ 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"
}
}
答案 0 :(得分:0)
fuzzy transposition与您所拥有的无关。它不适用于您的情况。如链接中所述,它解决了以下情况:如果您的查询为ab
,它将返回转置的结果,即ba
。
我尝试了您提到的场景,据我了解,您可能在字段中使用Ngram或Edge 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应该可以帮助您更多地了解模糊性。
希望这会有所帮助!