Elasticsearch索引数据库表列结构

时间:2014-03-01 02:46:48

标签: elasticsearch elasticsearch-jdbc-river

我对弹性搜索数据库索引的设置有疑问...我创建了一个表格,我已经在elasticsearch中编制了索引。该表是从一个脚本构建的,该脚本查询多个表以对数据进行非规范化,从而更容易通过唯一的id 1:1比率进行索引

我所拥有的一组字段的示例是streetcitystatezip,我可以查询,但我的问题是,我应该保持这些字段单独索引,或将它们连接成一个大字段,如address,其中包含所有以前的字段为一个?或者花费额外的时间来设置父子索引?

用例示例是我的客户的计费信息来自一个方向,我想查询elasticsearch以查看该客户是否已经存在,或者至少返回最接近的结果

我知道这个问题比编程更具概念性,我找不到任何最佳实践的信息。

1 个答案:

答案 0 :(得分:2)

<强>级联

对于问题的第一部分:我不会将不同的字段连接到包含所有信息的字段中。拥有多个字段可以为您提供在这些字段上计算构面和聚合的优势,例如:有多少客户来自特定城市或拥有特定的拉链。您仍然可以使用匹配或多匹配查询来查询来自不同字段的信息。

除了将信息放在单独的字段中之外,我还会使用带有已分析和未分析部分的多字段(fieldname.raw)。这再次允许聚合,构面和排序。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.90/mapping-multi-field-type.html

想想'纽约':如果你分析它将被存储为['新','约克'],你将无法看到来自'纽约'的所有人。你看到的是来自'新'和'约克'的所有人。

_all field

elasticsearch中有一个特殊的_all字段,用于在后台进行连接。你不必自己动手。可以启用/禁用它。

父母子女关系

关于是否使用嵌套对象或父子关系的部分:我认为使用父子关系更适合您的情况。嵌套对象以“展平”方式存储,即来自数组中嵌套对象的信息被存储为一个对象的一部分。请考虑以下示例:

您有客户订单:

client: 'Samuel Thomson'
    orderline: 'Strong Thinkpad'
    orderline: 'Light Macbook'
client: 'Jay Rizzi'
    orderline: 'Strong Macbook'

如果您搜索订购了“强Macbook”的客户,则使用嵌套对象,您将获得两个客户端。这是因为'Samuel Thomson'和他的命令完全存储,即['Strong''Thinkpad''Light''Macbook'],两个订单线之间没有区别。

通过使用父子文档,同一客户端的订单行不会混合并保留其标识。