我在Django项目中使用Elasticsearch DSL库。主要查询是:
s.query("multi_match", query=query, type='phrase', fields=['name', 'title'])
搜索'Joe Gray'
会返回名为'Joe Gray'
的任何人。但是搜索乔·格雷'不会返回'Joe B Gray'
或'Joe W Gray'
的任何名称。有没有办法可以修改我的查询以按名字和姓氏搜索,但是显示中间姓名的结果?
答案 0 :(得分:0)
您不需要查询类型为"短语"。删除type='phrase'
参数可以解决您的问题。
指定type='phrase'
时,Elasticsearch会使用match_phrase
查询匹配整个短语。令牌需要与查询中的匹配位置相同。
multi_match中类型的默认行为是best_fields
,对于您的用例应该没问题。
答案 1 :(得分:0)
名称搜索可能很棘手。有些事情需要考虑:
所以想一个解决方案。去多个领域是要走的路。你的查询语言是什么?您想让用户想要使用通配符,还是想要制作这个虚拟证明?我假设你选择后一种方法......
"type": "keyword"
。请参阅:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-boost.html name.lowercase
的子字段中支持区分大小写的搜索(请参阅:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-keyword-tokenizer.html和https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lowercase-tokenfilter.html)Joe Bernard Gray
可能等同于Joe B. Gray
。也许您想要创建一个名为name.normalized
的字段,您还可以在Joe B. Gray
中为name.normalized
添加值Joe Bernard Gray
。为name.normalized
应用大小写折叠。并且不需要标点符号。 I.B.M可能与IBM使用char filter
name.normalized
,也可能name.lowercase
相同,请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-mapping-charfilter.html ascii folding
中的name.normalized
对字符进行规范化,请参阅https://www.elastic.co/guide/en/elasticsearch/reference/2.4/analysis-asciifolding-tokenfilter.html Synonym Token Filter
添加到name.normalized
字段,请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-shingle-tokenfilter.html Shingle Token
过滤器在name.normalized
中找到多个相同名称的组合,请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-shingle-tokenfilter.html 所以你会:
通过设置更高级的映射,您可以避免编写复杂的查询。