在elasticsearch中过滤_id范围

Dou*_*los 11 range filter elasticsearch

我试图按范围过滤弹性搜索中的_id字段(索引未启用).可能吗?如果是这样,怎么办?我在弹性搜索文档中读到,我们可以使用'id'来查询_id和类型,但我看不出如何使用范围过滤器.(我不想在_id上启用索引).

{
  "from": 0,
  "size": 20,
  "query": {
    "match_all": {}
  },
  "filter": {
        "range": {
          "_id": {
            "gt": "51f7b6b7710c42b136027581"
          }
        }
  },
  "sort": {
    "pubdate": {
      "order": "desc"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

xec*_*cgr 4

也许有点晚了,但我尝试回答,也许答案对你仍然有用。
看了同事的评论,我认为可以提炼出两个主要观点:

  1. Elasticsearch 生成的 id 不能用于过滤或执行除 GET 或 id 搜索之外的任何操作。
  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)
Run Code Online (Sandbox Code Playgroud)

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

elasticsearch_query = {
    "query": {
        "filtered": {
            "filter": {
                "range": {
                    "id": {
                        "gte" : 3,
                        "lt"  : 5
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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