带有短语的ElasticSearch Bool过滤器(而不是单个单词/标签)

时间:2013-02-09 23:45:57

标签: elasticsearch

在弹性搜索中,此过滤器

{
  "bool": {
    "must": {
      "term": {
        "article.title": "google"
      }
    }
  }
}

正确退回标题中带有“google”的文章。

然而,

{
  "bool": {
    "must": {
      "term": {
        "article.title": "google earth"
      }
    }
  }
}

不会返回任何结果,尽管标题中的文章中包含“google earth”字样。我希望它能这样做。

完整查询:

{
  "size": 200,
  "filter": {
    "bool": {
      "must": {
        "term": {
          "article.title": "google maps"
        }
      }
    }
  },
  {
    "range": {
      "created_date": {
        "from": "2013-01-11T02:14:03.352Z"
      }
    }
  }]
}
}

如您所见,我没有“查询” - 只是过滤器,大小和范围。所以我认为ElasticSearch正在使用默认的分析器......?

我误解了什么?


编辑:对于那些寻找解决方案的人来说,这是我的过滤器:

{
  "query": {
    "bool": {
      "must": {
        "must_match": {
          "article.title": "google earth"
        }
      }
    }
  }
}

节点(1)我们用“查询”包装bool过滤器和(2)“term”变为“must_match”,这导致整个短语匹配(而不是“匹配”,这将搜索在Google地球上使用标准分析器的article.title。

完整查询如下所示:

{
  "size": 200,
  "filter": {
    "query": {
      "bool": {
        "must": {
          "must_match": {
            "article.title": "google earth"
          }
        }
      }
    }
  }
}

FWIW,我在“过滤器”字段中具有此条件的原因(与使用标准查询相反)是有时我想使用“must_not”而不是“must_not”,有时我还添加其他查询的元素。

4 个答案:

答案 0 :(得分:10)

Elasticsearch根本没有使用分析器,因为您使用了term query,它会查找确切的术语。

您的title字段已被分析(除非您另行指定),因此"google earth"将被编入索引为["google","earth"]这两个字词。这就是term的{​​{1}}查询有效,但"google"的{​​{1}}查询不起作用的原因 - 那个EXACT术语不存在。

如果您使用match query,则会在搜索之前分析您的查询字词。

答案 1 :(得分:0)

对于那些最近磕磕绊绊的人,请注意以更简洁的方式来表示

{"query":{"bool":{"must":{"must_match":{"article.title":"google earth"}}}}}

{"query":{"match_phrase":{"article.title":"google earth"}}}

答案 2 :(得分:0)

我通过爆炸传递的短语来解决这个问题,所以只需要改变。

toy_model_parallel <- function(x){ 
    f <- function(x){
        x = x^2
    }
    set.seed(x[1])
    2 * x[2] + f(2) + rnorm(1,0,0.1)
}

{"bool":{"must":{"term":{"article.title":"google earth"}}}}

它不漂亮,如果你有很多疑问,可能会太慢,但它确实有效。

注意,我刚刚发现这也将返回任何结果与&#34; google&#34;或者&#34;地球&#34;。

答案 3 :(得分:0)

使用Elasticsearch 5.4.2。,我的解决方案演变为以下一个:

{"query": {
     "bool": {
         "must": {
             "match_phrase": {
                 "article.title": "google earth"}}}}}

希望这有助于某人。