可以在一个字段上使用多少个搜索分析器?

时间:2015-12-11 19:22:30

标签: elasticsearch

我是否认为你只能在一个字段上使用1 search analyzer

例如,我说我的title字段为multi-field special_title,我是否可以title指定search_analyzer1和{ {1}}另一个特定的special_title?这是一个映射来说明我的意思:

search_analyzer2

更新

似乎这是不可能的,这是证明它的要点:

{
    "title": {
        "analyzer": "standard",
        "search_analyzer": "search_analyzer1",
        "type": "string",
        "fields": {
            "special_title": {
                "type": "string",
                "index": "analyzed",
                "analyzer": "standard",
                "search_analyzer": "search_analyzer2"
            }
        }
    }
}

查询返回0结果,我希望"抗真菌药"将传递给 PUT /my_index { "settings": { "analysis": { "char_filter":{ "hyphen":{ "type": "pattern_replace", "pattern": "[-]", "replacement": "" }, "space":{ "type": "pattern_replace", "pattern": " ", "replacement": "" } }, "analyzer": { "merge":{ "type":"custom", "tokenizer":"standard", "filter": [ "lowercase" ], "char_filter": ["hyphen", "space", "html_strip"] } } } }, "mappings": { "my_type": { "properties": { "title": { "type": "string", "analyzer": "standard", "search_analyzer": "standard", "fields": { "title_merge" : { "type": "string", "analyzer": "standard", "search_analyzer": "merge" } } } } } } } delete my_index PUT my_index/my_type/1 { "title": "antiemetics" } GET my_index/_search { "query": { "query_string" : { "fields" : ["title", "title_merge"], "default_operator": "AND", "query" :"anti emetics", "use_dis_max" : true } } } 搜索分析器,然后将查询标记为merge,以便它可以匹配索引中的标记。所以看起来不可能,这是非常奇怪和令人失望的。

更新2

我可以通过匹配查询按预期启动合并分析器,但不能使用query_string,如果它是一个带连字符的术语,我不能指望用户输入带引号的术语寻找。

antiemetics

1 个答案:

答案 0 :(得分:1)

是的,可以为每个字段提供自己的search_analyzer

查询

{
  "query": {
    "match": {
      "title": "title one"
    }
  }
}

在这种情况下,search_analyzer1将应用于"标题1"和

{
  "query": {
    "match": {
      "title.special_title": "title two"
    }
  }
}

这将是analyzedsearch_analyzer2

编辑1

您的查询存在两个问题。

1)您应该使用title_merge

访问字段title.title_merge

2)考虑到您的分析仪设置,我认为您正在寻找的是精确匹配。您当前的查询正在查找两个单独的令牌 AND emetics

您需要使用双引号来获得预期结果。来自Docs

  

查询字符串被解析为一系列术语和运算符。一个   术语可以是单个单词 - 快速或棕色 - 或短语,包围   用双引号 - "快速棕色" - 搜索中的所有单词   这个短语,顺序相同。

我认为此查询可以正常工作

GET my_index/_search
{
  "query": {
    "query_string": {
      "fields": [
        "title*"
      ],
      "query": "\"anti emetics\"",
      "use_dis_max": true
    }
  }
}

现在ES会将anti emetics视为短语,由于antiemetics space,它会合并到char_filter,您将获得预期的结果。

这有帮助吗?