"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 应该可以帮助您更多地了解模糊性。
希望对您有所帮助!
我一直在搜索,但我不确定在使用 "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 应该可以帮助您更多地了解模糊性。
希望对您有所帮助!