ElasticSearch使用通配符和术语查询

时间:2014-04-12 22:11:55

标签: elasticsearch

我是使用弹性搜索的新手,我也从未使用过Lucene。

我构建了这个查询:

  {
    "query" : {
      "wildcard" : { "referer" : "*.domain.com*" }
    },
    "filter" : {
      "query" : {
        "term" : { "first" : "1" }
      }
    },
    "facets" : {
      "site_id" : {
        "terms" : {
          "field" : "site",
          "size" : "70"
        }
      }
    }
  }

通配符工作得很好,但是术语过滤器被忽略了,我做错了什么?

我需要使用通配符和术语

过滤结果

谢谢!

1 个答案:

答案 0 :(得分:2)

假设您要做的是在通配符查询结果上应用过滤器, 你可以使用FilteredQuery。但是,您的情况可能更适合过滤器。

您使用查询过滤器。您可以直接在FilteredQuery中使用TermFilter,而不是使用TermQuery过滤器。 TermFilter应该更快,因为它直接使用TermsEnum。

请注意,过滤器的结果会缓存在FilterCache中,过滤器会更快,因为它们不会对文档进行任何评分。在您的情况下,即使FilteredQuery的过滤器部分可以快速工作,但通配符查询将不必要地进行评分。您可以尝试使用AND Filter来同时使用queryfilter(通配符查询)和术语过滤器,而不是FilteredQuery。

要使过滤器按照您的要求工作,请尝试以下操作。 (没试过自己)

{
    "filtered" : {
        "query" : {
            "wildcard" : { "referer" : "*.domain.com*" }
        },
        "filter" : {
             "term" : { "first" : "1" }
        }
    },
    "facets" : {
        "site_id" : {
            "terms" : {
                "field" : "site",
                "size" : "70"
            }
        }
    }
}