使用Java进行弹性搜索Lucene公式计算

时间:2019-01-16 05:05:54

标签: java elasticsearch lucene

Elastic搜索的新功能,使用索引来存储文档,例如是有关雇员的公司信息,索引中目前有60万个雇员数据,在这些雇员中,我们需要根据特定属性(例如地址)来计算距离计算。我们要做的基本上是以下步骤:

  • 在Java程序中将索引中的所有文档拉出。
  • 使用Lambdas进行并行处理,并遍历每个文档,然后计算集合中其他元素的距离(lavenshtien,NGram和TFID),然后取平均值。

此流程的问题是,我们将索引中存在的所有文档加载到Java内存中,然后应用公式,这会花费大量时间来加载和应用公式,而且JVM将具有内存限制将文档加载到内存中。

请原谅我关于该主题的有限知识,但是有一种方法可以直接在弹性搜索中运行这些距离公式,而不是将整个索引加载到内存中。

感谢帮助...

1 个答案:

答案 0 :(得分:1)

elasticsearch中有一个用于地理点的数据类型:https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-point.html

如果您可以将拥有的地址转换为纬度/经度坐标,或者拥有该地址,或使用将地址解析为地理位置的服务,则可以将该地理位置字段映射到elasticsearch geo_point(在索引模板,请参阅我上面粘贴的链接)。如果不将字段映射到geo_point,elasticsearch会将其视为浮点数组,即浮点类型。

一旦有了地理坐标字段,就可以开始在其上运行一些距离聚合。有三种聚合可用于geo_point类型的字段。请参阅此处的选项:https://www.elastic.co/guide/en/elasticsearch/guide/current/geo-aggs.html