如何配置 OpenSearch 以允许查找带引号的精确匹配项

问题描述 投票:0回答:1

我正在尝试解决如何配置 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“请只给我完全匹配的内容”。

我希望这是有道理的。谢谢!

tokenize matching opensearch
1个回答
0
投票

要仅进行完全匹配,您可以使用

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"
}

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.