【问题标题】:Elasticsearch indexed database table column structureElasticsearch 索引数据库表列结构
【发布时间】:2014-03-01 02:46:47
【问题描述】:

我有一个关于我的 elasticsearch 数据库索引设置的问题...我已经创建了一个表,我已经在 elasticsearch 中建立索引。该表是由一个脚本构建的,该脚本查询多个表以对数据进行非规范化,从而更容易按唯一 id 1:1 比率进行索引

我拥有的一组字段的示例是streetcitystatezip,我可以对其进行查询,但我的问题是,我是否应该将这些字段单独编入索引?将它们连接成一个大字段,如address,其中包含所有以前的字段?还是要花额外的时间来设置父子索引?

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

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

【问题讨论】:

    标签: elasticsearch elasticsearch-jdbc-river


    【解决方案1】:

    串联

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

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

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

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

    _所有字段

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

    父子关系

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

    您有一个客户的订单:

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

    如果您搜索订购“Strong Macbook”的客户,则使用嵌套对象会同时获得这两个客户。这是因为 'Samuel Thomson' 和他的订单是一起存储的,即 ['Strong' 'Thinkpad' 'Light' 'Macbook'],所以两条订单线之间没有区别。

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

    【讨论】:

      猜你喜欢
      • 2013-01-06
      • 1970-01-01
      • 2012-04-01
      • 2013-06-23
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      相关资源
      最近更新 更多