使用过滤器

时间:2016-03-30 04:15:47

标签: elasticsearch elasticsearch-plugin elastic-map-reduce

我有弹性搜索索引的1702个文档,其中类别为字段之一,并且还有一个名为SequentialId的字段。

我最初提取了类别1.1的文档,这些文档位于文档1和文档850之间,如下所示。

**POST testucb/docs/_search
{
    "size": 1702, 
    "query": {
        "bool": {
            "must": [
               {"match": {
                  "Category": "1.1"
               }}
            ],
            "filter":[
                {
                    "range":
                    {
                        "SequentialId":
                        {
                            "gte":1,
                            "lte":850

        }
    }
}
]
}
}
}**

上面的查询给了我834个匹配类别1.1的文档。(我有二进制文件从结果JSON输出中解析出834个_ids。) 我现在的目标是将这些834 _ids提供给more_like这个查询作为我的测试集的剩余文档的训练集(来自sequentialid 851到1702的文档是我的测试集)

我在下面用过滤器尝试了这个more_like_this查询。

POST /testucb/docs/_search
{

"size": 1702, 
    "fields": [
            "SequentialId",
            "Category",
            "PRIMARY_CONTENT_EN"
         ],
   "query": {
      "more_like_this": 
      {
         "fields": [
            "PRIMARY_CONTENT_EN"
         ],
        "like":[
           <-----------834 _ids goes here ---->
            ],
            **"filter":[
                {
                    "range":
                    {
                        "SequentialId":
                        {
                            "gte":851,
                            "lte":1702**

        }
    }
}
],
        "min_term_freq": 1,
        "min_doc_freq": 1,
         "max_query_terms": 15,            
        "min_word_len": 3,

        "stop_words": [
                   ], 
        "boost": 2,
        "include":false
}
}
}

我收到查询解析异常,说MLT不支持过滤器。  我不知道如何将我从851到1702的sequentialid作为我的测试集提供剩余的文档。

我希望能够清楚地知道我期待完成的事情。你们可以帮助我完成任务吗?我是弹性搜索的新手。

1 个答案:

答案 0 :(得分:11)

如果你想事先更像这个查询和过滤器,你应该使用bool query with filter clause(Elasticsearchversion&gt; 2.0)

POST /testucb/docs/_search
{
  "size": 1702,
  "fields": [
    "SequentialId",
    "Category",
    "PRIMARY_CONTENT_EN"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "more_like_this": {
            "fields": [
              "PRIMARY_CONTENT_EN"
            ],
            "like": [
              <-----------834 _ids goes here ---->
            ],
            "min_term_freq": 1,
            "min_doc_freq": 1,
            "max_query_terms": 15,
            "min_word_len": 3,
            "stop_words": [],
            "boost": 2,
            "include": false
          }
        }
      ],
      "filter": {
        "range": {
          "SequentialId": {
            "gte": 851,
            "lte": 1702
          }
        }
      }
    }
  }
}

如果您使用旧版本的elasticsearch,则应使用filtered query代替