@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
非常感谢你提供的初步指导,我希望其他人也能从中受益。
content
应该替换为您想要搜索的field_name
。例如,如果您想要搜索title
字段,则将"content": {"fuziness": "2", "value": "word"}
替换为"title": {"fuziness": "2", "value": "word"}
。 - Dan Lupascu