带有前缀查询的Elastic Search不区分大小写查询

时间:2019-06-17 10:20:58

标签: elasticsearch case-insensitive

我是弹性搜索的新手。我在下面查询

GET deals2/_search 
{
  "size": 200,
  "_source": ["acquireInfo"],
   "query": {
    "bool": {

      "must": [
        {

         "query_string": {
           "fields": ["acquireInfo.company_name.keyword"],
           "query": "az*"
         }
        }
      ]
    }
  }

}

在这里,我希望Elastic应该给出不区分大小写的结果,例如以下面的字符串开头的字符串

"Az" 
"AZ" 
"az"
"aZ"
"Az"

但是我并没有像这样得到所有结果。所以任何人都可以帮助我。

示例:-我有4个文档

1)Aziia Avto Ust-Kamenogorsk OOO 
2)AZ Infotech Inc 
3)AZURE Midstream Partners LP 
4)State Oil Fund of the Republic of Azerbaijan

现在在az上搜索时,应该只返回前3个文档,因为它们以az开头,忽略大小写,而不是第四个文档,后者也有az,但开头没有。

1 个答案:

答案 0 :(得分:2)

这是在您使用关键字字段在应用程序中为company_name编制索引时发生的。

关键字分析器是一个“空转”分析器,它以单个令牌的形式返回整个输入字符串,例如公司名称,由fooFoo,{ {1}}仅存储大小写,并搜索fOo,仅匹配foo,因为弹性搜索最终适用于令牌匹配(区分大小写)。

您需要使用standard analyzer或其他一些custom analyzer来解决您的其他用例,并在现场使用lowercase token filter并使用match被分析的查询,并使用与用于对该字段建立索引的分析器相同的分析器,这样,您的搜索查询将生成相同的令牌,这些令牌存储在索引中,并且搜索将不区分大小写。

编辑:在聊天中与用户进行了讨论,并更新了答案以满足其要求,这些要求如下:-

步骤1:-定义索引的设置和映射。

端点:-http:// {{hostname}}:{{port}} / {{index}}

foo

第2步:为所有文档建立索引

端点:http:// {{hostname}}:{{port}} / {{index}} / _doc /-> 1,2,3,4等

{
  "settings": {
    "analysis": {
      "normalizer": {
        "my_normalizer": {
          "type": "custom",
          "char_filter": [],
          "filter": "lowercase"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "company_name": {
        "type": "keyword",
        "normalizer": "my_normalizer"
      }
    }
  }
}

Step3:-搜索查询

端点:-http:// {{hostname}}:{{port}} / {{index}} / _search

{
    "company_name" : "State Oil Fund of the Republic of Azerbaijan"
}

这将带来以下预期结果:-

{ "query": {
    "prefix" : { "company_name" : "az" }
  }
}

说明:,因为早期的OP并未在搜索结果中提及排除第4个文档,因此我建议创建一个文本字段,以便生成个人令牌,但现在根据需要仅仅是前缀搜索,我们不需要单独的令牌,我们只需要1个令牌,但是应该将其小写以支持不区分大小写的搜索,这就是我在{ "took": 870, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 3, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "prerfixsearch", "_type": "_doc", "_id": "2ec9df0fc-dc04-47bb-914f-91a9f20d09efd15f2506-293f-4fb2-bdc3-925684a930b5", "_score": 1, "_source": { "company_name": "AZ Infotech Inc" } }, { "_index": "prerfixsearch", "_type": "_doc", "_id": "160d01183-a308-4408-8ac1-a85da950f285edefaca2-0b68-41c6-ba34-21bbef57f84f", "_score": 1, "_source": { "company_name": "Aziia Avto Ust-Kamenogorsk OOO" } }, { "_index": "prerfixsearch", "_type": "_doc", "_id": "1da878175-7db5-4332-baa7-ac47bd39b646f81c1770-7ae1-4536-baed-0a4f6b20fa38", "_score": 1, "_source": { "company_name": "AZURE Midstream Partners LP" } } ] } } 字段上应用自定义规范化器的原因。 / p>