gpt4 book ai didi

elasticsearch - 尽管在索引和搜索上都使用了小写过滤器,但为什么我的 Elasticsearch 前缀查询区分大小写?

转载 作者:行者123 更新时间:2023-11-29 02:56:44 24 4
gpt4 key购买 nike

问题

我正在使用 ElasticSearch 6.2.3 开发一个自动完成器。我希望使用以下优先级对我的查询结果(带有名称字段的页面列表)进行排序:

  1. “名称”开头的前缀匹配(前缀查询)
  2. “名称”(术语查询)中的任何其他完全(整个单词)匹配
  3. 模糊匹配(目前这是使用 ngram 分词器在与名称不同的字段上完成的……所以我认为这与我的问题无关,但我也想将其应用于名称字段)

我尝试的解决方案

我将使用由三个查询组成的 Bool/Should 查询(对应于上面的三个优先级),使用 boost 来定义相对重要性。

我遇到的问题是前缀查询 - 尽管我的搜索分析器具有小写过滤器,但它似乎没有将搜索查询小写。例如,以下查询为“harry”返回“Harry Potter”,但为“Harry”返回零结果:

{ "query": { "prefix": { "Name.raw" : "Harry" } } }

我已经使用 _analyze API 验证了我的两个分析器确实将文本“Harry”小写为“harry”。我哪里错了?

从 ES 文档中我了解到我需要以两种不同的方式分析 Name 字段以启用 Prefix 和 Term 查询:

  1. 使用“关键字”分词器启用 Prefix查询(我已将其应用于 .raw 字段)

  2. 使用标准分析器启用 Term (我已经在名称字段中应用了这个)

我检查了重复的问题,例如 this one但答案没有帮助

我的映射和设置如下

ES 索引映射

{
"myIndex": {
"mappings": {
"pages": {
"properties": {
"Id": {},
"Name": {
"type": "text",
"fields": {
"raw": {
"type": "text",
"analyzer": "keywordAnalyzer",
"search_analyzer": "pageSearchAnalyzer"
}
},
"analyzer": "pageSearchAnalyzer"
},
"Tokens": {}, // Other fields not important for this question
}
}
}
}
}

ES 索引设置

{
"myIndex": {
"settings": {
"index": {
"analysis": {
"filter": {
"ngram": {
"type": "edgeNGram",
"min_gram": "2",
"max_gram": "15"
}
},
"analyzer": {
"keywordAnalyzer": {
"filter": [
"trim",
"lowercase",
"asciifolding"
],
"type": "custom",
"tokenizer": "keyword"
},
"pageSearchAnalyzer": {
"filter": [
"trim",
"lowercase",
"asciifolding"
],
"type": "custom",
"tokenizer": "standard"
},
"pageIndexAnalyzer": {
"filter": [
"trim",
"lowercase",
"asciifolding",
"ngram"
],
"type": "custom",
"tokenizer": "standard"
}
}
},
"number_of_replicas": "1",
"uuid": "l2AXoENGRqafm42OSWWTAg",
"version": {}
}
}
}
}

最佳答案

前缀查询不分析搜索词,因此您传递给它的文本绕过将用作搜索分析器的任何内容(在您的情况下,配置的 search_analyzer: pageSearchAnalyzer )并评估 Harry按原样直接针对关键字标记化、自定义过滤 harry potter那是 keywordAnalyzer 的结果在索引时应用。

在您的情况下,您需要执行以下几项不同的操作之一:

  1. 由于您使用的是 lowercase在该字段上进行过滤,您可以始终在前缀查询中使用小写术语(如有必要,使用应用程序端小写)
  2. 运行 match查询 edge_ngram -分析字段而不是 prefix查询如 ES search_analyzer docs 中所述

这是后者的一个例子:

1) 使用 ngram 分析器和(推荐的)标准搜索分析器创建索引

PUT my_index
{
"settings": {
"index": {
"analysis": {
"filter": {
"ngram": {
"type": "edgeNGram",
"min_gram": "2",
"max_gram": "15"
}
},
"analyzer": {
"pageIndexAnalyzer": {
"filter": [
"trim",
"lowercase",
"asciifolding",
"ngram"
],
"type": "custom",
"tokenizer": "keyword"
}
}
}
}
},
"mappings": {
"pages": {
"properties": {
"name": {
"type": "text",
"fields": {
"ngram": {
"type": "text",
"analyzer": "pageIndexAnalyzer",
"search_analyzer": "standard"
}
}
}
}
}
}
}

2) 索引一些示例文档

POST my_index/pages/_bulk
{"index":{}}
{"name":"Harry Potter"}
{"index":{}}
{"name":"Hermione Granger"}

3) 针对 ngram 字段运行匹配查询

POST my_index/pages/_search
{
"query": {
"match": {
"query": "Har",
"operator": "and"
}
}
}

关于elasticsearch - 尽管在索引和搜索上都使用了小写过滤器,但为什么我的 Elasticsearch 前缀查询区分大小写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50368459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com