Elasticsearch使用中间首字母搜索名称

时间:2017-12-11 12:09:39

标签: elasticsearch

我在Django项目中使用Elasticsearch DSL库。主要查询是:

s.query("multi_match", query=query, type='phrase', fields=['name', 'title'])

搜索'Joe Gray'会返回名为'Joe Gray'的任何人。但是搜索乔·格雷'不会返回'Joe B Gray''Joe W Gray'的任何名称。有没有办法可以修改我的查询以按名字和姓氏搜索,但是显示中间姓名的结果?

2 个答案:

答案 0 :(得分:0)

您不需要查询类型为"短语"。删除type='phrase'参数可以解决您的问题。 指定type='phrase'时,Elasticsearch会使用match_phrase查询匹配整个短语。令牌需要与查询中的匹配位置相同。 multi_match中类型的默认行为是best_fields,对于您的用例应该没问题。

答案 1 :(得分:0)

名称搜索可能很棘手。有些事情需要考虑:

  1. 顺序很重要,所以我理解为什么你使用短语查询,但是我认为复杂的短语查询不是一个优雅的搜索解决方案。您可以通过创建保留订单的子字段(即无标记化)在索引或查询时提升此值。
  2. 大写(区分大小写)可能不会改变名称的含义。
  3. 搜索缩写和一些字符规范化。
  4. 同义词,例如威廉经常和比尔一样,理查德和迪克一样等等。
  5. 所以想一个解决方案。去多个领域是要走的路。你的查询语言是什么?您想让用户想要使用通配符,还是想要制作这个虚拟证明?我假设你选择后一种方法......

    所以你会:

    • 名称(最高提升),name.lowercase(高提升),name.normalized(无提升)。

    通过设置更高级的映射,您可以避免编写复杂的查询。