ElasticSearch/开放搜索:通配符查询不适用于超长关键字字段

oyxsuwqo  于 2023-01-16  发布在  ElasticSearch
关注(0)|答案(1)|浏览(211)

我是ElasticSearch/OpenSearch的新手,所以如果我忽略了一些基本的东西,请原谅。
我正在做一个对小说进行全文搜索的服务。novels index包含以下字段:

  • title关键字。平均长度为10-40个字符。
  • conetnt文本类型。在大多数文档中,长度远远超过100,000。

作为一个实验,我把content类型改为关键字,因为我想知道文本类型和关键字类型的区别,我不确定包含超长关键字字段的文档是否会被索引,但没有出现问题。
并尝试对其执行以下通配符查询。

{
  "query": {
    "wildcard": {
      "content": "*あらゆる透明な幽霊の複合体*"
    }
  }
}

但是,它没有命中包含上述短语的文档。之后,我尝试在title字段上进行通配符查询,效果很好,然后我尝试match_phrase查询,如下所示,它也命中了正确的文档:

{
  "query": {
    "match_phrase": {
      "content": "あらゆる透明な幽霊の複合体"
    }
  }
}

所以,我能想到的通配符查询不能在content字段上工作的唯一原因是,它太长了。
现在,我有两个问题。
1.我的假设--通配符查询不适用于超长文本--对吗?
1.如果我的假设是正确的,为什么通配符查询不适用于超长文本?其背后的机制是什么?
如果你能解释一下,我将不胜感激。
顺便说一句,我在docker上使用的是opensearch1.2.4。

siv3szwd

siv3szwd1#

原因可能是keyword字段的ignore_above参数设置为小于内容长度的某个值,因此任何长于该值的文本字符串都不会被索引。
将长文本字符串存储为关键字通常不是一个好主意。您应该根据具体的用例选择match_only_textwildcard字段类型。
然而,我认为这两种字段类型在Opensearch上不可用,因此您唯一的选择是使用ignore_above参数,或者简单地使用text字段类型和match_phrase查询。

相关问题