2014-03-01 179 views
2

我有一个关于我的elasticsearch数据库索引的设置的问题...我创建了一个表,我已经在elasticsearch中索引了。该表是从该查询多个表以非规范化数据使它更容易索引由一个唯一的id 1脚本构建的:1的比例Elasticsearch索引数据库表列结构

一组字段的我是streetcitystatezip,的一个例子,其我可以查询,但我的问题是,我应该保持这些字段单独编入索引,还是将它们连成一个像address这样的大字段,其中包含以前的所有字段?还是要花费额外的时间来设置亲子指数?

的使用情况实例是我有帐单信息从一个方向传来一个客户,我要查询elasticsearch,看看是否已有客户,或者至少返回最接近的结果

我知道这个问题是比编程更概念化,我无法找到最佳实践的任何信息。

回答

2

级联

对于你的问题的第一部分:我不会串联不同的领域为包含所有信息的字段。拥有多个字段可为您计算这些字段上的方面和聚合的优势,例如,有多少客户来自特定城市或具有特定的邮政编码。您仍然可以使用匹配或多匹配查询来查询来自不同字段的信息。

除了具有独立字段中的信息之外,我还将使用带分析和not_analyzed部分的多字段(fieldname.raw)。这又允许聚合,分面和排序。

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

“纽约”的想:如果你分析它会被保存为[“新”,“纽约”],你将无法看到“纽约所有的人。你会看到所有来自'New'和'York'的人。

_all场

有一个在elasticsearch这确实串联在后台一个特殊的_all场。你不必亲自去做。可以启用/禁用它。

父子关系

关于部分是否使用嵌套对象或父子关系:我觉得用一个父子关系更适合你的情况。嵌套对象以“拼合”方式存储,即来自数组中嵌套对象的信息被存储为一个对象的一部分。请看下面的例子:

您有一个订单的客户:

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

使用嵌套的对象,如果你搜索谁下令“强的Macbook”,你会得到两个客户端的客户端。这是因为“Samuel Thomson”和他的订单完全保存在一起,即['Strong''Thinkpad''Light''Macbook'],所以两条命令行之间没有区别。

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

+1

谢谢你回答了我的许多问题! –