node.js - 按字符串长度搜索弹性查询
问题描述
{
"query": {
"bool": {
"must": {
"bool": {
"must": [
{
"multi_match": {
"query": "FGTHSF-2124-6",
"type": "phrase_prefix",
"fields": [
"contact.name"
]
}
},
{
"terms": {
"contact.id": [
"sdfwerwe",
"6789",
"4567",
"12345"
]
}
}
],
"should": [],
"must_not": []
}
},
"filter": {
"bool": {
"must": {
"bool": {
"must": [],
"should": [],
"must_not": []
}
}
}
}
}
}
}
我有这个查询,如果我搜索它,我没有得到任何结果,因为最后一个字符是单个数字,但是如果我给出 3 位数字,它会搜索正确的记录...短语前缀查询的默认大小是否有,如果有,那么如何更改它。
我尝试给出默认运算符、前缀长度、最大扩展等。
解决方案
contact.name 将 search_analyzer 作为“标准”,将索引分析器作为“自动完成”(设置不可用)。您的问题是因为字段在索引和搜索时转换为不同的标记,因此它们不匹配。
通常,在索引时和搜索时应使用相同的分析器,以确保查询中的术语与倒排索引中的术语格式相同。
但是,有时在搜索时使用不同的分析器可能是有意义的,例如在使用 edge_ngram 标记器进行自动完成时。
前任。具有以下设置
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 3
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
},
"mappings": {
.....
}
以下令牌将存储在索引中
GET index79/_analyze
{
"text": "FGTHSF-2124-645",
"analyzer": "autocomplete"
}
{
"tokens" : [
{
"token" : "fgt",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "212",
"start_offset" : 7,
"end_offset" : 11,
"type" : "<NUM>",
"position" : 1
},
{
"token" : "645",
"start_offset" : 12,
"end_offset" : 15,
"type" : "<NUM>",
"position" : 2
}
]
}
现在,当您搜索“查询”:“HSF-2124-6”时,它不会返回任何文档([“HSF”,“2124”,“6”]),因为 6 不存在于任何令牌中。要返回文档,您需要将“min_gram”更改为 1 以生成大小为 1、3 和 3(645=> 6 64 645) 的标记。
如果您不使用 edge gram,请添加自动完成定义
编辑1:
如果您将在快照中看到最小克大小为 5,最大克大小为 20。生成的最小令牌大小为 5,例如为这些生成的“Abhijeet”令牌将是“Abhij”、“Abhije”、“Abhijee”、“Abhjieet”。因此,任何小于 5 大小的文本都不会匹配前“Abhi”。在您的情况下,在 hyphen("-") 上拆分后获取文本,因此 6 不匹配。您需要更新索引设置并制作 min-gram:1。
脚步。1. 发布 /index80/_close
- 以下只是您设置中的一个示例,复制整个分析部分,更新 mingram 等 PUT 请求
PUT index80/_settings
{
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 10,
"token_chars": [
"letter",
"digit"
]
}
}
}
}
3. 发布 /index80/_open
在此处查看如何更新设置以获取更多信息。
注意:减小最小大小将导致创建额外的令牌并增加索引的大小。最小和最大克数的选择应基于您的查询文本大小
推荐阅读
- apache-kafka - Kafka Stream:最终结果立即发出?
- visual-studio-code - 如何在调试控制台中禁用线程消息?
- mongodb - 无法在课程猫鼬中设置对用户文档的引用
- python - Spark 到 MongoDB 的连接在没有有意义的错误的情况下关闭
- node.js - 使用服务帐户的 Google 目录 API - 错误自签名证书
- git - gitlab:将存储库移动到 gitlab 内的另一个组
- c# - How to get input from textbox in C#?
- python - 绘制 Cstr 方程
- javascript - 如何修复“输出中没有数组名称”
- matlab - Multiple conditions with 'if' statement