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