7

在弹性搜索中,这个过滤器

{
  "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)我们用“query”包装了布尔过滤器,(2)“term”更改为“must_match”,这导致整个短语被匹配(而不是“match”,它将搜索文章。标题与谷歌地球上的标准分析仪)。

完整的查询如下所示:

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

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

4

4 回答 4

11

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

您的title字段已分析(除非您另有说明),因此"google earth"将被索引为两个术语["google","earth"]。这就是为什么term查询"google"有效,但term查询"google earth"无效 - EXACT 术语不存在。

如果您改用match查询,则将在搜索之前分析您的查询词。

于 2013-02-10T09:44:17.640 回答
0

对于那些最近偶然发现的人,请注意,使用更简洁的方式来表示

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

是与

{"query":{"match_phrase":{"article.title":"google earth"}}}
于 2015-05-06T04:26:42.160 回答
0

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

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

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

如果您有很多查询,它并不漂亮并且可能会太慢,但它确实有效。

注意,我刚刚发现这也会返回任何带有“google”或“earth”的结果。

于 2015-06-01T14:03:53.357 回答
0

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

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

希望这可以帮助某人。

于 2017-08-24T05:51:07.857 回答