在 Elasticsearch 中搜索包含 "not" 关键字的字符串
Search in Elasticsearch for a string containing the "not" keyword
我在 AWS(7.9 版)上使用 ElasticSearch,我试图区分两个字符串。
我的主要目标是将搜索结果拆分为“找到”和“未找到”。
一般问题是如何搜索“not”关键字。
您可以在下面看到两个示例消息。
"CachingServiceOne:Found in cache - Retrieve."
"CachingServiceThree:Not found in cache - Create new."
您可以使用 ngram tokenizer,在 "title"
字段上搜索 "not"
。
添加包含索引数据、映射、搜索查询和搜索结果的工作示例
索引映射:
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 5,
"token_chars": [
"letter",
"digit"
]
}
}
},
"max_ngram_diff": 10
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
索引数据:
{
"title":"CachingServiceThree:Not found in cache - Create new."
}
{
"title":"CachingServiceOne:Found in cache - Retrieve."
}
搜索查询:
{
"query":{
"match":{
"title":"Not"
}
}
}
搜索结果:
"hits": [
{
"_index": "67093372",
"_type": "_doc",
"_id": "2",
"_score": 0.6720003,
"_source": {
"title": "CachingServiceThree:Not found in cache - Create new."
}
}
]
好吧,问题似乎确实出在默认分析器的工作方式上,而不是我无法搜索 not
这个词。这就是为什么我接受了答案。但我想补充一点。为了简单起见。
默认分析器不在 :
上拆分单词。
也就是说,我们要搜索title:CachingServiceThree\:Not
.
其中title
为字段名,:
必须转义\:
.
诀窍是 title:*\:Not
和 title:*\:Found
使用 KQL 语法。
使用 wildcard 成功获取所有内容。我想知道使用所有实际值的数组是否会更快。
通过检查面板翻译成:
{
"query": {
"bool": {
"filter": [
{
"bool": {
"should": [
{
"query_string": {
"fields": [
"title"
],
"query": "*\:Not"
}
}
],
"minimum_should_match": 1
}
}
]
}
}
}
我在 AWS(7.9 版)上使用 ElasticSearch,我试图区分两个字符串。
我的主要目标是将搜索结果拆分为“找到”和“未找到”。
一般问题是如何搜索“not”关键字。
您可以在下面看到两个示例消息。
"CachingServiceOne:Found in cache - Retrieve."
"CachingServiceThree:Not found in cache - Create new."
您可以使用 ngram tokenizer,在 "title"
字段上搜索 "not"
。
添加包含索引数据、映射、搜索查询和搜索结果的工作示例
索引映射:
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 5,
"token_chars": [
"letter",
"digit"
]
}
}
},
"max_ngram_diff": 10
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
索引数据:
{
"title":"CachingServiceThree:Not found in cache - Create new."
}
{
"title":"CachingServiceOne:Found in cache - Retrieve."
}
搜索查询:
{
"query":{
"match":{
"title":"Not"
}
}
}
搜索结果:
"hits": [
{
"_index": "67093372",
"_type": "_doc",
"_id": "2",
"_score": 0.6720003,
"_source": {
"title": "CachingServiceThree:Not found in cache - Create new."
}
}
]
好吧,问题似乎确实出在默认分析器的工作方式上,而不是我无法搜索 not
这个词。这就是为什么我接受了答案。但我想补充一点。为了简单起见。
默认分析器不在
:
上拆分单词。也就是说,我们要搜索
title:CachingServiceThree\:Not
.其中
title
为字段名,:
必须转义\:
.
诀窍是 title:*\:Not
和 title:*\:Found
使用 KQL 语法。
使用 wildcard 成功获取所有内容。我想知道使用所有实际值的数组是否会更快。
通过检查面板翻译成:
{
"query": {
"bool": {
"filter": [
{
"bool": {
"should": [
{
"query_string": {
"fields": [
"title"
],
"query": "*\:Not"
}
}
],
"minimum_should_match": 1
}
}
]
}
}
}