1

我想使用 EdgeNGram 分析器对字段进行不区分大小写的搜索。我通过elastica在 php 中使用 ES 。

我有用户表

{
   "user": {
      "analyzer": "analyzer_edgeNGram",
      "properties": {
         "admin": {
            "type": "boolean"
         },
         "firstName": {
            "type": "string",
            "analyzer": "analyzer_edgeNGram"
         },
         "lastName": {
            "type": "string",
            "analyzer": "analyzer_edgeNGram"
         },
         "username": {
            "type": "string",
            "analyzer": "analyzer_edgeNGram"
         }
      }
   }
}

我的分析器看起来像这样(你可以看到 egdeNGram 分析器中有小写过滤器)

         "index.analysis.filter.asciifolding.type": "asciifolding",
         "index.number_of_replicas": "1",
         "index.analysis.filter.standard.type": "standard",
         "index.analysis.tokenizer.edgeNGram.token_chars.1": "digit",
         "index.analysis.tokenizer.edgeNGram.max_gram": "10",
         "index.analysis.analyzer.analyzer_edgeNGram.type": "custom",
         "index.analysis.tokenizer.edgeNGram.token_chars.0": "letter",
         "index.analysis.filter.lowercase.type": "lowercase",
         "index.analysis.tokenizer.edgeNGram.side": "front",
         "index.analysis.tokenizer.edgeNGram.type": "edgeNGram",
         "index.analysis.tokenizer.edgeNGram.min_gram": "1",
         "index.analysis.tokenizer.standard.type": "standard",
         "index.analysis.analyzer.analyzer_edgeNGram.filters": "standard,lowercase,asciifolding",
         "index.analysis.analyzer.analyzer_edgeNGram.tokenizer": "edgeNGram",
         "index.number_of_shards": "1",
         "index.version.created": "900299"

例如,有名字 Miroslav 的用户。如果我这样查询

{"query": {"match": {"firstName": "miro"}}}

我有 0 次点击。但是,如果我将查询 miro 更改为 Miro,它会找到。我检查了令牌是如何生成的,它们区分大小写:M、Mi、Mir、...

任何建议如何实现不区分大小写的搜索?谢谢

4

1 回答 1

0

默认search_analyzer设置是standard并且具有以下设置:

"analyzer": {
  "rebuilt_standard": {
    "tokenizer": "standard",
    "filter": [
      "lowercase"       
    ]
  }
}

因此,默认情况下,您的查询必须不区分大小写,但您始终可以尝试将 search_analyzer 的值设置为其他值。在文档中:

但是,有时在搜索时使用不同的分析器可能是有意义的,例如在使用 edge_ngram 标记器进行自动完成时。

默认情况下,查询将使用字段映射中定义的分析器,但这可以用 search_analyzer 设置覆盖:

于 2019-11-25T15:04:54.800 回答