我正在尝试解决如何配置 OpenSearch 索引及其映射以允许使用引号进行搜索以找到搜索词的精确匹配。
目前,所有字段都是
text
类型,并且在索引或字段映射上没有定义分词器或分析器。所以一切都是默认的。
PUT /items/_mappings
{
"properties": {
...
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
...
}
搜索示例 1:
name=ABC
返回名称包含“ABC”的项目。正如预期的那样。
搜索示例2:
name="ABC"
当前返回匹配列表,包括ABC
,还包括ABC DEF EFG
、ABC foo
、bar ABC
等。因此,所有名称包含“ABC”的项目也会被返回。
那么如何配置索引,以便
name="ABC"
仅返回名为“ABC”的项目?
通常搜索是在没有引号的情况下完成的,这会正确返回名称包含“ABC”的所有项目。引号应该告诉 OpenSearch“请只给我完全匹配的内容”。
我希望这是有道理的。谢谢!
要仅进行完全匹配,您可以使用
keyword
字段类型。在您的情况下, name.keyword: ABC
和 name.keyword: "ABC"
都只会匹配完全匹配的内容。
在elasticsearch或opensearch中发现:
name : ABC
是匹配查询。
name : "ABC"
是一个 match_phrase 查询。
文本字段类型被标记化,并且
ABC DEF EFG
由空格标记化,并变为 ABC
和 DEF
和 EFG
,因为 name: ABC
和 name: "ABC"
查询都将与 ABC DEF EFG
文档匹配。
keyword
字段类型已标记化,但会有一个标记,即所有单词。所以 ABC DEF EFG
被代币化并再次成为 ABC DEF EFG
。
通过
_analyzer
API 调用进行说明。
#standard tokenizer for `text` field type
POST _analyze
{
"text": "ABC DEF EFG",
"tokenizer": "standard"
}
#standard tokenizer for `keyword` field type
POST _analyze
{
"text": "ABC DEF EFG",
"tokenizer": "keyword"
}