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

发布于 2021-02-01 11:47:48

我是elasticsearch的新手。我有以下查询

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 此处忽略大小写开始,而不是第4 个文档,而第4个文档也包含az但不包含开头。

关注者
0
被浏览
392
1 个回答
  • 面试哥
    面试哥 2021-02-01
    为面试而生,有面试问题,就找面试哥。

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

    关键字分析器是一个“空操作”分析仪,它返回整个输入串作为一个单一令牌
    例如,公司名称,包括fooFoofOo将存储有情况下,只有和搜索foo,将只匹配foo作为elasticsearch最终工作在令牌匹配(区分大小写)。

    您需要使用标准分析器或其他自定义分析器,该分析器也可以解决您的其他用例,并在字段上使用小写标记过滤器,并使用被分析的匹配查询,并使用用于索引的同一分析器字段,这样您的搜索查询将生成相同的令牌,这些令牌存储在索引中,并且您的搜索将不区分大小写。

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

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

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

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

    步骤2:为所有文件建立索引

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

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

    步骤3:-搜索查询

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

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

    这将带来以下预期结果:

    {
        "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"
                    }
                }
            ]
        }
    }
    

    说明:
    ,正如早期的OP一样;在搜索结果中没有提到排除第4个文档,这就是我建议创建一个文本字段的原因,以便生成单个标记,但是现在只要求前缀搜索,所以我们不需要单个标记,我们只需要1个标记,但是应该将其小写以支持不区分大小写的搜索,这就是我在company_name字段上应用自定义规范化器的原因。



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看