当前位置: 首页 > 知识库问答 >
问题:

Elatticsearch部分,区分大小写匹配

常甫
2023-03-14

我试图在Elasticseach 7中实现部分的、区分大小写的匹配。

我正在使用设置创建索引:

{
  "merchant_3" : {
    "settings" : {
      "index" : {
        "number_of_shards" : "2",
        "provided_name" : "merchant_3",
        "max_result_window" : "100000",
        "creation_date" : "1592833582520",
        "analysis" : {
          "analyzer" : {
            "englishAnalyzer" : {
              "filter" : [
                "lowercase"
              ],
              "tokenizer" : "standard"
            }
          }
        },
        "number_of_replicas" : "1",
        "uuid" : "5mjRMQ65TSGFFU0LfAH4eA",
        "version" : {
          "created" : "7060299"
        }
      }
    }
  }
}

以及映射:

{
  "merchant_3" : {
    "mappings" : {
      "properties" : {
        "Name" : {
          "type" : "keyword"
        },
        ...
      }
    }
  }
}

以下查询将正确返回文档:

POST /merchant/_search
{
  "query": {
    "wildcard": {
        "Name": "*Example*"
    }
  }
}

但当我将搜索词小写时,它不会返回文档:

POST /merchant/_search
{
  "query": {
    "wildcard": {
        "Name": "*example*"
    }
  }
}

如何配置Elasticsearch,使其与使用小写搜索词的名称字段值匹配?

共有1个答案

公西俊才
2023-03-14

正如评论中提到的,当前方法存在几个缺陷,并且由于您没有提到您的用例,我建议阅读我的SO回答,其中解释了您应该考虑的各种功能和非功能需求。

在您的情况下,我使用ngram分析器添加索引时间方法,如果您需要前缀类型的部分搜索,可以将其更改为边缘ngram。

索引映射

{
  "settings": {
    "analysis": {
      "filter": {
        "autocomplete_filter": {
          "type": "ngram",
          "min_gram": 1,
          "max_gram": 10
        }
      },
      "analyzer": {
        "autocomplete": { 
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "autocomplete_filter"
          ]
        }
      }
    },
    "index.max_ngram_diff": 5 // note this
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "autocomplete", // note this
        "search_analyzer": "standard" // note this
      }
    }
  }
}

索引样本文档

{
  "title" : "Example movie"
}

使用示例进行搜索

{
    "query": {
        "match" : {
            "title" : "Example"
        }
    }
}

后果

"hits": [
      {
        "_index": "testpartial",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.471659,
        "_source": {
          "title": "Example movie"
        }
      }
    ]

用小字母example搜索也会产生相同的结果,只需更改之前查询中的搜索词即可。

 类似资料:
  • 问题内容: 我正在尝试提出一个要求区分大小写的结果的请求。 例如在我的数据库中 该请求是 但我有3行作为结果,我只想要abcdef 我试图找到一个解决方案 但是我有这个错误: 未知归类:’Latin1_General_CS_AS’{“成功”:false,“错误”:“#1273-未知归类:’Latin1_General_CS_AS’”} 谢谢 问题答案: 感谢您的帮助,我找到了不是latin1 ut

  • 对于报告(0.1%的所有查询),我需要返回一个所有可能类别的列表,区分大小写! 考虑以下文件: 运行以下查询: 返回: 是否有方法返回区分大小写的类别(存储在文档中)?我对此查询结果中的感兴趣。 Elasticsearch论坛中的问题 谢谢,伊泰

  • 问题内容: indexOf(String)方法区分大小写吗?如果是这样,是否有不区分大小写的版本? 问题答案: 这些方法均区分大小写。通过预先将字符串转换为大写/小写,可以使它们(大致来说,以一种折断的方式,但是可以处理很多情况)不区分大小写:

  • 问题内容: 如何根据情况使LINQ区分大小写和不区分大小写? 我正在使用sql server 2008和Entity Framework 4.0。 我更改了COLLATION以使SQL Server区分大小写。因此对于以下情况: 它很棒。但是,当按主题(或名称或类似名称)搜索时,我需要能够 忽略大小写而 从数据库中提取数据,如下所示: 当记录是“ TestString”并且我正在寻找“ test”

  • 问题内容: 我有一个Lucene索引,该索引当前区分大小写。我想添加的 选项 有不区分大小写作为后备的。这意味着与案例匹配的结果将获得更大的权重,并且将首先出现。例如,如果结果数限制为10,并且有10个匹配项符合我的情况,那就足够了。如果仅找到7个结果,则可以从不区分大小写的搜索中再添加3个结果。 我的案子实际上更复杂,因为我有不同重量的物品。理想情况下,匹配“错误”的表壳会增加一些重量。不用说,