12

我正在尝试按范围过滤弹性搜索中的 _id 字段(未启用索引)。可能吗?如果是这样,它是如何做到的?我在 elasticsearch 文档中读到,我们可以使用“ids”通过 _id 和类型进行查询,但我看不到如何使用范围过滤器来完成。(我不想在 _id 上启用索引)。

{
  "from": 0,
  "size": 20,
  "query": {
    "match_all": {}
  },
  "filter": {
        "range": {
          "_id": {
            "gt": "51f7b6b7710c42b136027581"
          }
        }
  },
  "sort": {
    "pubdate": {
      "order": "desc"
    }
  }
}
4

1 回答 1

2

也许有点晚了,但我试着回答,也许答案对你仍然有用。
看到给同事做的评论,我觉得可以提炼出两个主要的思路:

  1. Elasticsearch 生成的 id 不能用于过滤或执行除 GET o id search 之外的任何操作。
  2. 索引自定义 uid 值被猜测(这就是我尝试解决问题的方式)

因此,我编写了一个示例来检查解决方案 2 是否可行。关键部分是这些:

#cluster node to query
es = Elasticsearch(['localhost:9200',])
records = [
    #some custom data
]
for idx,r in enumerate(records):
    _index_config = dict(index_config)
    #set Elasticsearch uid
    _index_config['_id'] = idx
    #replicate in a document field to be able to filter for
    r['id'] = idx
    kwargs['body'].append({'index' : _index_config})
    kwargs['body'].append(r)

_ = es.bulk(**kwargs)

为字段编制索引后id,您可以根据需要对其进行过滤。range过滤器就是其中之一

elasticsearch_query = {
    "query": {
        "filtered": {
            "filter": {
                "range": {
                    "id": {
                        "gte" : 3,
                        "lt"  : 5
                    }
                }
            }
        }
    }
}

您可以在此笔记本中看到一个工作示例

于 2017-03-04T07:08:14.763 回答