在elasticsearch中过滤_id范围

时间:2013-07-30 16:49:05

标签: filter elasticsearch range

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

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

1 个答案:

答案 0 :(得分:2)

也许有点晚了,但我试着回答,也许答案对你来说仍然有用。
看到对同事的评论,我认为可以提取两个主要想法:

  1. Elasticsearch生成的ID无法用于过滤或执行GET或id搜索以外的任何操作。
  2. 猜测索引自定义uid值(这就是我尝试解决问题的方式)
  3. 因此,我编写了一个示例来检查解决方案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
                        }
                    }
                }
            }
        }
    }
    

    您可以在this notebook

    中看到一个有效的例子