带有多个术语的模糊,通配符搜索:将所有数据放入一个属性中?

时间:2017-01-30 16:27:21

标签: java elasticsearch fuzzy-search elasticsearch-5

我目前正在将Elasticsearch作为搜索界面嵌入到现有应用程序中。 该应用程序是一个带有oracle SQL数据库的经典3层应用程序。

我有实体'人物' (数据库表),具有以下属性:

  • 名字
  • 姓氏
  • 全名(包含连接的名字和姓氏)
  • 人-NR。
  • 公司名称
  • 地址列表:街道,邮政编码,城市,电话和电子邮件。

到目前为止,我把它1:1放入elasticsearch中,每个db-column都是elasticsearch中的一个属性。 数据的同步和满载是没有问题的。但我正努力提供一个好的"搜索体验,因为有许多不同的事情需要注意:

  • 模糊搜索(一个或两个编辑距离的容差)
  • 通配符搜索(如果我键入" Ange",它也应该找到结果" Angelina")
  • 电子邮件地址搜索(我已将uax_url_email标记生成器与keyword数据类型结合使用)

据我所知,multi_match,类型cross_fields将是一个不错的选择,但它不能进行模糊搜索和通配符。类型best_fields也没有选项,因为它不能进行通配符搜索(据我所知)? most_fields也不合适,phrase matching无法模糊。

正因为如此,我目前正在使用simple_query_string,例如:

在搜索字段中,我输入Tom fishersimple_query_string中的查询是:

(tom* | tom~1)+(fisher* | fisher~1)

现在我的问题是,仅仅拥有字段" entity_content",它包含所有字段的内容是不是一个坏主意?这就像我有一个.txt文档,其中包含有关此人的所有信息。

  • 有哪些优点/缺点?

1 个答案:

答案 0 :(得分:0)

默认情况下,Elastic有_all字段,该字段已经是全部字段,例如所有信息都存储在该字段中,而不考虑它来自何处。

  

_all字段非常有用,尤其是在使用时探索新数据时   简单的过滤。但是,通过将字段值连接成一个大的   字符串,_all字段失去了短字段之间的区别   (更相关)和长领域(不太相关)。对于用例在哪里   搜索相关性很重要,最好查询单个字段   具体

     

_all字段不是免费的:它需要额外的CPU周期并使用更多   磁盘空间。如果不需要,可以完全禁用或自定义   在每个领域的基础上。