我有下面的查询来增加我的搜索的模糊性。但是,我现在意识到,匹配查询并不像match_phrase那样考虑搜索字符串中单词的顺序。然而,我不能让match_phrase给我结果的模糊性。有没有一种方法来判断匹配,以考虑单词之间的顺序和距离?
{
"query": {
"match": {
"content": {
"query": "some search terms like this",
"fuzziness": 1,
"operator": "and"
}
}
}
}发布于 2016-08-08 07:09:36
最后,我发现我需要使用span查询的组合,这些查询对模糊性和斜率进行了很好的微调。我需要添加一个函数来手动标记短语,并以编程方式添加到“子句”数组中:
{"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"发布于 2017-08-15 12:14:12
@econgineer优秀帖子。
我想为我们正在处理的ES查询尝试一下--但是我太懒了,不想继续执行JSON数据.
我觉得这个密码有效..。奇怪的是,它使jq抱怨,但ElasticSearch工作..。
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)))如果你美化输出
cat t2.json | tr "\'" "\"" | jq '.'你应该看看
{
"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,这只是一个正常的
curl --silent My_ES_Server:9200:/INDEX/_search -d @t2.json非常感谢最初的指导,我希望其他人发现这是有用的。
发布于 2018-01-25 02:29:22
的确,这是一个很好的问题和答案。我很惊讶,这种“模糊短语匹配”没有现成的支持。
下面是一个经过测试的NodeJS代码,它在多个搜索(msearch)的上下文中生成模糊短语匹配(多子句)查询块,但是它应该与单个搜索一样工作。
使用:
const queryBody = [
{ index: 'YOUR_INDEX' },
createESFuzzyPhraseQueryBlock('YOUR PHRASE', 'YOUR_FIELD_NAME', 2)
];
client.msearch({
body: queryBody
})函数
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;
};https://stackoverflow.com/questions/38816955
复制相似问题