Elasticsearch 添加同义词分析器后区分大小写
Elasticsearch Became case sensitive after add synonym analyzer
我将同义词分析器添加到 my_index 后,索引变得区分大小写
我有一个名为 nationality
的 属性,它有 synonym analyzer
。但是好像这个属性因为同义词分析器变成了case sensitive
这是我的 /my_index/_mappings
{
"my_index": {
"mappings": {
"items": {
"properties": {
.
.
.
"nationality": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
},
"analyzer": "synonym"
},
.
.
.
}
}
}
}
}
在索引中,我有单词 India COUNTRY
。当我尝试使用下面的命令搜索 India nation
时,我将得到结果。
POST /my_index/_search
{
"query": {
"match": {
"nationality": "India nation"
}
}
}
但是,当我搜索 india
(注意字母 i
是小写的)时,我什么也得不到。
我的假设是,发生这种情况是因为我在 synonym
之前放置了 uppercase
过滤器。我这样做是因为同义词是大写的。因此查询 India
将在通过此过滤器后变为 INDIA
。
这是我的 /my_index/_settings
{
"my_index": {
"settings": {
"index": {
"number_of_shards": "1",
"provided_name": "my_index",
"similarity": {
"default": {
"type": "BM25",
"b": "0.9",
"k1": "1.8"
}
},
"creation_date": "1647924292297",
"analysis": {
"filter": {
"synonym": {
"type": "synonym",
"lenient": "true",
"synonyms": [
"NATION, COUNTRY, FLAG"
]
}
},
"analyzer": {
"synonym": {
"filter": [
"uppercase",
"synonym"
],
"tokenizer": "whitespace"
}
}
},
"number_of_replicas": "1",
"version": {
"created": "6080099"
}
}
}
}
}
有什么方法可以使 属性 仍然不区分大小写。我找到的所有解决方案只表明我应该只将 nationality
内的所有文本设置为小写或大写。但是如果我在索引中有大写和小写字母怎么办?
将数据添加到索引后是否应用了同义词过滤器?
如果是,可能“India COUNTRY”短语被索引为“India COUNTRY”。当您向索引发送匹配查询时,您的查询被分析并作为“INDIA COUNTRY”发送,因为您不再有大写过滤器,它被匹配是因为您正在使用匹配查询,它足以匹配其中一个词。 “国家/地区”一词提供了这一点。
但是,当您发送一个单词查询“india”时,由于您的大写过滤器,它会被分析并转换为“INDIA”,但您的索引中没有任何匹配的单词。您只有一个文档包含“India COUNTRY”。
我的回答有一点假设。希望对理解您的问题有所帮助。
我找到了解决办法!
我没有意识到我在 settings
中应用的过滤器在更新和搜索数据时适用。一开始,我做了这一步:
- 使用同义词过滤器创建索引
- 插入数据
- 在同义词过滤器前添加
uppercase
这样,uppercase
过滤器就不会应用于我的数据。我应该做的是:
- 使用
uppercase
& synonym
过滤器创建索引(注意顺序)
- 插入数据
然后过滤器将应用于我的数据。
我将同义词分析器添加到 my_index 后,索引变得区分大小写
我有一个名为 nationality
的 属性,它有 synonym analyzer
。但是好像这个属性因为同义词分析器变成了case sensitive
这是我的 /my_index/_mappings
{
"my_index": {
"mappings": {
"items": {
"properties": {
.
.
.
"nationality": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
},
"analyzer": "synonym"
},
.
.
.
}
}
}
}
}
在索引中,我有单词 India COUNTRY
。当我尝试使用下面的命令搜索 India nation
时,我将得到结果。
POST /my_index/_search
{
"query": {
"match": {
"nationality": "India nation"
}
}
}
但是,当我搜索 india
(注意字母 i
是小写的)时,我什么也得不到。
我的假设是,发生这种情况是因为我在 synonym
之前放置了 uppercase
过滤器。我这样做是因为同义词是大写的。因此查询 India
将在通过此过滤器后变为 INDIA
。
这是我的 /my_index/_settings
{
"my_index": {
"settings": {
"index": {
"number_of_shards": "1",
"provided_name": "my_index",
"similarity": {
"default": {
"type": "BM25",
"b": "0.9",
"k1": "1.8"
}
},
"creation_date": "1647924292297",
"analysis": {
"filter": {
"synonym": {
"type": "synonym",
"lenient": "true",
"synonyms": [
"NATION, COUNTRY, FLAG"
]
}
},
"analyzer": {
"synonym": {
"filter": [
"uppercase",
"synonym"
],
"tokenizer": "whitespace"
}
}
},
"number_of_replicas": "1",
"version": {
"created": "6080099"
}
}
}
}
}
有什么方法可以使 属性 仍然不区分大小写。我找到的所有解决方案只表明我应该只将 nationality
内的所有文本设置为小写或大写。但是如果我在索引中有大写和小写字母怎么办?
将数据添加到索引后是否应用了同义词过滤器?
如果是,可能“India COUNTRY”短语被索引为“India COUNTRY”。当您向索引发送匹配查询时,您的查询被分析并作为“INDIA COUNTRY”发送,因为您不再有大写过滤器,它被匹配是因为您正在使用匹配查询,它足以匹配其中一个词。 “国家/地区”一词提供了这一点。
但是,当您发送一个单词查询“india”时,由于您的大写过滤器,它会被分析并转换为“INDIA”,但您的索引中没有任何匹配的单词。您只有一个文档包含“India COUNTRY”。
我的回答有一点假设。希望对理解您的问题有所帮助。
我找到了解决办法!
我没有意识到我在 settings
中应用的过滤器在更新和搜索数据时适用。一开始,我做了这一步:
- 使用同义词过滤器创建索引
- 插入数据
- 在同义词过滤器前添加
uppercase
这样,uppercase
过滤器就不会应用于我的数据。我应该做的是:
- 使用
uppercase
&synonym
过滤器创建索引(注意顺序) - 插入数据 然后过滤器将应用于我的数据。