elasticsearch,Php,elasticsearch" /> elasticsearch,Php,elasticsearch" />

Php Elasticsearch-使用EdgeNGram analyzer进行不区分大小写的搜索

Php Elasticsearch-使用EdgeNGram analyzer进行不区分大小写的搜索,php,elasticsearch,Php,elasticsearch,我想使用EdgeNGram analyzer对字段进行不区分大小写的搜索。我正在通过php使用ES 我有一张用户表 { "user": { "analyzer": "analyzer_edgeNGram", "properties": { "admin": { "type": "boolean" }, "firstName": { "type": "string",

我想使用EdgeNGram analyzer对字段进行不区分大小写的搜索。我正在通过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

如何实现不区分大小写的搜索,有什么建议吗? 谢谢

默认的搜索分析仪设置是标准的,具有以下设置:

"analyzer": {
  "rebuilt_standard": {
    "tokenizer": "standard",
    "filter": [
      "lowercase"       
    ]
  }
}
因此,默认情况下,您的查询必须不区分大小写,但您可以尝试将search_analyzer的值设置为其他值。在:

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

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


您的筛选器似乎未应用于生成的令牌。您可以复制并粘贴索引映射吗?是否手动创建小写和标准筛选器?显然不应用筛选器。当我通过使用ruflin的elastica的PHP框架创建analyzer时,设置为index.analysis.analyzer.analyzer_edgeNGram.filters:标准、小写、ascifolding。但是当我通过curl命令创建它时,设置是index.analysis.analyzer.analyzer\u edgeNGram.filter.0:小写,index.analysis.analyzer.analyzer\u edgeNGram.filter.1:ascifolding,index.analysis.analyzer.analyzer\u edgeNGram.filter.2:标准。所以我猜它将在我使用的框架中。令牌是以区分大小写的方式生成的,您可以做的不多,是否可以重新索引您的数据并向您的分析器添加小写筛选器?