4

弹性搜索版本:0.90.2

这是问题所在:我想在索引中找到文档,以便它们:

  1. 匹配多个字段中的所有查询标记
  2. 使用字段自己的分析器

因此,如果有 4 个文件:

{ "_id" : 1, "name" : "Joe Doe",     "mark" : "1", "message" : "Message First" }
{ "_id" : 2, "name" : "Ann",         "mark" : "3", "message" : "Yesterday Joe Doe got 1 for the message First"}
{ "_id" : 3, "name" : "Joe Doe",     "mark" : "2", "message" : "Message Second" }
{ "_id" : 4, "name" : "Dan Spencer", "mark" : "2", "message" : "Message Third" }

并且查询是“Joe First 1”,它应该找到 ids 1 和 2。即,它应该找到包含搜索查询中所有标记的文档,无论它们在哪个字段中(可能所有标记都在一个字段中,或者可能每个令牌都在自己的字段中)。

一种解决方案是使用elasticsearch“_all”字段功能:这样它将我需要的所有字段(名称,标记,消息)合并为一个,我将能够使用类似的东西来查询它

"match": {
  "_all": {
    "query": "Joe First 1",
    "operator": "and"
  }
}

但这样我只能为“_all”字段指定分析器。而且我需要“名称”和“消息”字段来拥有不同的标记器/标记过滤器集(假设名称将具有语音分析器,而消息将具有一些词干标记过滤器)。

有没有办法做到这一点?

4

3 回答 3

2

感谢elasticsearch组的人,这是解决方案......非常简单需要说:)

我需要做的就是将 query_string 查询http://www.elasticsearch.org/guide/reference/query-dsl/query-string-query/与 default_operator = AND 一起使用,它就可以解决问题:

{
  "query": {
    "query_string": {
      "fields": [
        "name",
        "mark",
        "message"
      ],
      "query": "Joe First 1",
      "default_operator": "AND"
    }
  }
}
于 2013-08-08T20:47:32.900 回答
0

正如您所说,您可以设置analyzer(或search_analyzer/ index_analyzer)在_all现场使用。在我看来,这确实应该是实现您正在寻找的查询结果的第一步。

来自http://jontai.me/blog/2012/10/lucene-scoring-and-elasticsearch-_all-field/,我们有这个美味的报价:

... _all 字段从其他字段复制文本并再次分析它们;它不会复制预先分析的令牌。您可以为 _all 字段设置单独的分析器。

我将其解释为您应该设置_all分析器以及单个字段分析器。该_all字段不会重新分析单个字段数据;它将抓取原始字段内容。

于 2013-08-08T16:57:03.833 回答
0

我认为在这里使用多重匹配查询是有意义的。就像是:

"multi_match": {
    "query": "Joe First 1",
    "operator": "and"
    "fields": [ "name", "message", "mark"]
}
于 2013-08-07T22:47:12.930 回答