【问题标题】:Elasticsearch query on array index数组索引上的 Elasticsearch 查询
【发布时间】:2015-01-13 20:21:33
【问题描述】:

如何在 elasticsearch 中按数组索引查询/过滤?

我有一个这样的文件:-

PUT /edi832/record/1
{
    "LIN": [ "UP", "123456789" ]
}

我想搜索 LIN[0] 是否为“UP”并且 LIN[1] 是否存在。

谢谢。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    这可能看起来像一个 hack ,但它肯定会起作用。 首先,我们应用令牌计数类型和多字段来捕获令牌的数量作为一个字段。 所以映射将如下所示 -

    {
        "record" : {
            "properties" : {
                "LIN" : {
                    "type" : "string",
                    "fields" : {
                        "word_count": {
                            "type" : "token_count",
                            "store" : "yes",
                            "analyzer" : "standard"
                        }
                    }
                }
            }
        }
    }
    

    链接-http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-core-types.html#token_count

    所以要检查第二个字段是否存在,就像检查这个字段值是否大于或等于 2 一样简单。 接下来我们可以使用令牌过滤器检查令牌“up”是否存在于位置 0。 我们可以使用脚本过滤器来检查这一点。 因此,像下面这样的查询应该可以工作 -

    {
      "query": {
        "filtered": {
          "query": {
            "range": {
              "LIN.word_count": {
                "gte": 2
              }
            }
          },
          "filter": {
            "script": {
              "script": "for(pos : _index['LIN'].get('up',_POSITIONS)){ if(pos.position == 0) { return true}};return false;"
            }
          }
        }
      }
    }
    

    高级脚本 - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-advanced-scripting.html

    脚本过滤器 - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-script-filter.html

    【讨论】:

    • 看起来不错。但是如果帖子的作者对更改索引的映射没有问题,我会说这种方法加上bool查询更有效。
    • 按照您推荐的方法,我们如何确保令牌“向上”出现在第一位?
    • 谢谢@Vineeth Mohan。我已经接受了这个答案。它提供了足够的指针来建立这个。
    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 2014-05-30
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2017-04-02
    相关资源
    最近更新 更多