弹性搜索更像是带有过滤器的查询是添加结果

时间:2017-10-17 23:51:34

标签: elasticsearch lucene elasticsearch-2.0

我对“taggeable”类型的定义如下:

{
"mappings": {
    "taggeable" : {
        "_all" : {"enabled" : false},
        "properties" : {
            "category" : {
                "type" : "string"
            },
            "tags" : {
                "type" : "string",
                "term_vector" : "yes"
            }
        }
    }
}

}

我也有这5个文件:

Document1 (tags: "t1 t2", category: "cat1")
Document2 (tags: "t1"   , category: "cat1")
Document3 (tags: "t1 t3", category: "cat1")
Document4 (tags: "t4"   , category: "cat1")
Document5 (tags: "t4"   , category: "cat2")

以下查询:

{
"query": {
    "more_like_this" : {
        "fields" : ["tags"],
        "like" : ["t1", "t2"],
        "min_term_freq" : 1,
        "min_doc_freq": 1
        }
    }
}

正在回归:

Document1 (tags: "t1 t2", category: "cat1")
Document2 ("t1", category: "cat1")
Document3 ("t1 t3", category: "cat1")

哪个是对的,但是这个查询:

{
"query": {
     "filtered": {
     "query": {
         "more_like_this" : {
         "fields" : ["tags"],
         "like" : ["t1", "t2"],
         "min_term_freq" : 1,
         "min_doc_freq": 1
     },
    "filter": {
         "bool": {
                "must": [                            
                    {"match": { "category": "cat1"}}
                ]
         }
    }
 }

} }

正在回归:

Document1 (tags: "t1 t2", category: "cat1")
Document4 (tags: "t4"   , category: "cat1")
Document2 (tags: "t1"   , category: "cat1")
Document3 (tags: "t1 t3", category: "cat1")

这就是,现在也检索了Document4,它的分数与Documen1类似,即使当Document4没有“t1 t2”中包含任何单词时,它也是完美的匹配。

任何人都知道发生了什么?我正在使用Elastic Search 2.4.6

提前致谢

1 个答案:

答案 0 :(得分:1)

这是为什么一致的缩进很重要的一个很好的例子。在这里,我用一致的缩进修改了你发布的内容,问题更加明显(JSONLint是一个方便的工具,如果你没有使用有助于此的编辑器):

{
  "query": {
    "filtered": {
      "query": {
        "more_like_this": {
          "fields": ["tags"],
          "like": ["t1", "t2"],
          "min_term_freq": 1,
          "min_doc_freq": 1
        },
        "filter": {
          "bool": {
            "must": [{
              "match": {
                "category": "cat1"
              }
            }]
          }
        }
      }
    }
  }

您的过滤器是“查询”的子项,而不是“已过滤”的子项。

但实际上,您不应该使用过滤,不推荐使用see here。您应该将其更改为bool,如此处所指定的那样。