首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹性搜索模糊短语

问弹性搜索模糊短语
EN

Stack Overflow用户
提问于 2016-08-07 17:54:26
回答 4查看 8.5K关注 0票数 15

我有下面的查询来增加我的搜索的模糊性。但是,我现在意识到,匹配查询并不像match_phrase那样考虑搜索字符串中单词的顺序。然而,我不能让match_phrase给我结果的模糊性。有没有一种方法来判断匹配,以考虑单词之间的顺序和距离?

代码语言:javascript
复制
{
    "query": {
        "match": {
            "content": {
                "query": "some search terms like this",
                "fuzziness": 1,
                "operator": "and"
            }
        }
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-08 07:09:36

最后,我发现我需要使用span查询的组合,这些查询对模糊性和斜率进行了很好的微调。我需要添加一个函数来手动标记短语,并以编程方式添加到“子句”数组中:

代码语言:javascript
复制
{"query":
{
  "span_near": {
    "clauses": [
      {
        "span_multi": {
          "match": {
            "fuzzy": {
              "content": {
                "fuzziness": "2",
                "value": "word"
              }
            }
          }
        }
      },
      {
        "span_multi": {
          "match": {
            "fuzzy": {
              "content": {
                "fuzziness": "2",
                "value": "another"
              }
            }
          }
        }
      }                   
    ],
    "slop": 1,
    "in_order": "true"
票数 21
EN

Stack Overflow用户

发布于 2017-08-15 12:14:12

@econgineer优秀帖子。

我想为我们正在处理的ES查询尝试一下--但是我太懒了,不想继续执行JSON数据.

我觉得这个密码有效..。奇怪的是,它使jq抱怨,但ElasticSearch工作..。

代码语言:javascript
复制
import json
import pprint
from collections import defaultdict
nested_dict = lambda: defaultdict(nested_dict)
query=nested_dict()
query['span_near']['clauses']=list()
query['slop']='1'
query['in_order']="true"


words=['what','is','this']
for w in words:
    nest = nested_dict()
    nest["span_multi"]["match"]["fuzzy"]["msg"]["fuzziness"]["value"]=w
    nest["span_multi"]["match"]["fuzzy"]["msg"]["fuzziness"]["fuzziness"]="2"
    json.dumps(nest)
    query['span_near']['clauses'].append(json.loads(json.dumps(nest)))


pprint.pprint(json.loads(json.dumps(query)))

如果你美化输出

代码语言:javascript
复制
cat t2.json | tr  "\'" "\""  | jq '.'

你应该看看

代码语言:javascript
复制
{
  "in_order": "true",
  "slop": "1",
  "span_near": {
    "clauses": [
      {
        "span_multi": {
          "match": {
            "fuzzy": {
              "msg": {
                "fuzziness": {
                  "fuzziness": "2",
                  "value": "what"
                }
              }
            }
          }
        }
      },
      {
        "span_multi": {
          "match": {
            "fuzzy": {
              "msg": {
                "fuzziness": {
                  "fuzziness": "2",
                  "value": "is"
                }
              }
            }
          }
        }
      },
      {
        "span_multi": {
          "match": {
            "fuzzy": {
              "msg": {
                "fuzziness": {
                  "fuzziness": "2",
                  "value": "this"
                }
              }
            }
          }
        }
      }
    ]
  }
}

然后要查询ES,这只是一个正常的

代码语言:javascript
复制
curl --silent My_ES_Server:9200:/INDEX/_search -d @t2.json

非常感谢最初的指导,我希望其他人发现这是有用的。

票数 2
EN

Stack Overflow用户

发布于 2018-01-25 02:29:22

的确,这是一个很好的问题和答案。我很惊讶,这种“模糊短语匹配”没有现成的支持。

下面是一个经过测试的NodeJS代码,它在多个搜索(msearch)的上下文中生成模糊短语匹配(多子句)查询块,但是它应该与单个搜索一样工作。

使用:

代码语言:javascript
复制
const queryBody = [
  { index: 'YOUR_INDEX' },
  createESFuzzyPhraseQueryBlock('YOUR PHRASE', 'YOUR_FIELD_NAME', 2)
];

client.msearch({
   body: queryBody
})

函数

代码语言:javascript
复制
const createESFuzzyPhraseClauseBlock = (word, esFieldName, fuzziness) => {
    const clauseBlock = {
            "span_multi": {
                "match": {
                    "fuzzy": {
                        [esFieldName]: {
                            "fuzziness": fuzziness,
                            "value": word
                        }
                    }
                }
            }
        });

    return clauseBlock;
};


const createESFuzzyPhraseQueryBlock = (phrase, esFieldName, fuzziness) => {
    const clauses = phrase.split(' ').map(word => createESFuzzyPhraseClauseBlock(word, esFieldName, fuzziness));

    const queryBlock =
        {
            "query":
                {
                    "span_near": {
                        "clauses": clauses,
                        "slop": 1,
                        "in_order": "true"
                    }
                }
        };

    return queryBlock;
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38816955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档