Elasticsearch:查询时自定义分析器

时间:2019-07-26 14:23:59

标签: elasticsearch

我正在尝试在查询时间提供分析器,这不起作用。

  1. 创建索引
  

放置客户

  1. 关闭索引,然后使用分析仪配置和打开索引更新索引设置
  

PUT customer_new / _settings

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 3,
          "token_chars": [
                        "digit"
          ]
        }
      }
    }
  }
}
  1. 查询数据
  

获取客户/ _搜索

{
  "query": {
    "match": {
     "phonenumber": { "query":"678",
     "analyzer": "my_analyzer"
     }
    }
  }
}

但这不会返回任何结果。

  1. 关于查询的解释
  

POST客户/验证/查询?解释

{
  "query": {
    "match": {
     "phonenumber": { "query":"678",
     "analyzer": "my_analyzer"
     }
    }
  }
}

{
    "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
    },
    "valid": true,
    "explanations": [
        {
            "index": "customer",
            "valid": true,
            "explanation": "phonenumber:678"
        }
    ]
}

我要更新索引的原因是我已经拥有索引。我想做的是,我可以通过多种方式在字段上进行搜索,因此我想即时添加分析仪,然后在查询时使用它们。

我认为,如果我重新索引并通过更新映射在电话号码字段中配置此分析器,则它将起作用。但是就像我上面提到的,我不想重新索引,因为有数百万条记录,而且频繁地重新索引不是一种选择。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

简短的回答:您将不得不为文档重新编制索引

在查询中指定分析器时,查询中的文本将使用此分析器,而不是文档中的字段

例如,如果您使用默认分析器为“ Hello”建立索引并使用不带小写字母的分析器搜索“ Hello”,则不会得到结果,因为您将尝试将“ Hello”与“ hello”(即小写)进行匹配

唯一的解决方案应用新映射是对文档重新编制索引。您不能仅重新索引映射更改的字段。

这可能不是您要寻找的解决方案,但是这里有一些提示可以解决此问题:

  • 如果使用ngram分析器在术语内搜索,则可以将wildcard query*<SEARCH_TERM>*一起使用。 234将与12345相匹配。您无需创建新的分析器,因为您只需更改查询即可。请注意,它将带来重要的查询开销。

  • 不是重新索引整个索引,而是创建文档的子集。使用_reindex端点可以轻松完成此操作。仅使用此子集来测试和改善映射,对结果满意后,即可重新索引所有文档。

  • 如果尚未使用它们,请使用alias使该应用程序的重新编制索引透明。