使用“和”运算符搜索多个字段(但使用字段自己的分析器)

时间:2013-08-07 22:02:54

标签: lucene elasticsearch

ElasticSearch版本:0.90.2

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

  1. 在多个字段中匹配所有查询令牌
  2. 使用
  3. 字段拥有分析器
  4. 所以如果有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”它应该找到ID 1和2.也就是说,它应该找到包含来自搜索查询的所有标记的文档,无论它们在哪个字段中(可能所有标记都在一个字段中) ,或者每个令牌都在自己的领域中。)

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

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

    但是这样我只能为“_all”字段指定分析器。我需要“name”和“message”字段来设置不同的tokenizer / token过滤器(假设名称将使用语音分析器和消息将有一些词干标记过滤器)。

    有办法做到这一点吗?

3 个答案:

答案 0 :(得分: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"
    }
  }
}

答案 1 :(得分:0)

我认为使用multi match query在这里有意义。类似的东西:

"multi_match": {
    "query": "Joe First 1",
    "operator": "and"
    "fields": [ "name", "message", "mark"]
}

答案 2 :(得分:0)

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

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

  

... _all字段从其他字段和分析中复制文本   再次;它不会复制预先分析的令牌。你可以设置一个   _all字段的单独分析器。

我认为这意味着您应该设置_all分析仪以及单个场分析仪。 _all字段不会重新分析单个字段数据;它将获取原始字段内容。