Elasticsearch的默认会对查询语句进行N-grams的分词处理,假如是"平安", 查的时候结果不仅会显示结果"平安", 还会显示"平", "安"的结果,如何去掉单字结果呢?并不是网上所说的修改mapping,not_analyzed(2.x版本), keywords(5.x版本), 也不是加入most_fields, minimum_match等参数,而是简单的进行短语匹配,通过加入bool, should条件,形成多个字段的同时匹配,代码大概这样写:
search_res = es.search(index='test_index', body={
"query": {
"bool": {
"should": [
{"match_phrase": {"field1": name}},
{"match_phrase": {"field2": name}},
{"match_phrase": {"field3": name}},
{'wildcard': {'field4': {'value': '*{}*'.format(name)}}}
]
}
}
})同时这样写的好处是还可以对纯数字进行搜索("0001"这种), 这在之前用multi_match是做不到的。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3137630/ ,如需转载,请注明出处,否则将追究法律责任。