如何在 Vespa 中执行全文搜索?
How to perform a full-text search in Vespa?
我正在尝试对某些文档的某个字段进行全文搜索,我正在寻找您关于如何执行此操作的建议。我第一次尝试做这种类型的请求:
GET http://localhost:8080/search/?query=lord+of+the+rings
但它向我返回的文档中的字段是完全匹配的,并且除了给定的字符串外不包含其他信息,所以我尝试了 YQL 中的等效项:
GET http://localhost:8080/search/?yql=SELECT * FROM site WHERE text CONTAINS "lord of the rings";
我得到了完全相同的结果。但是当进一步阅读文档时,我发现了 MATCHES 指令,它确实通过执行这种请求给了我似乎正在寻找的结果:
GET http://localhost:8080/search/?yql=SELECT * FROM site WHERE text MATCHES "lord of the rings";
虽然我不知道为什么,对于这种类型的一些请求我遇到了这种类型的超时错误:
{
"root": {
"id": "toplevel",
"relevance": 1,
"fields": {
"totalCount": 0
},
"errors": [
{
"code": 12,
"summary": "Timed out",
"source": "site",
"message": "Timeout while waiting for sc0.num0"
}
]
}
}
所以我通过添加大于默认超时值解决了这个问题:
GET http://localhost:8080/search/?yql=SELECT * FROM site WHERE text MATCHES "lord of the rings";&timeout=20000
我的问题是,我是否以正确的方式进行全文搜索,我该如何改进它?
编辑:这是相应的搜索定义:
search site {
document site {
field text type string {
stemming: none
normalizing: none
indexing: attribute
}
field title type string {
stemming: none
normalizing: none
indexing: attribute
}
}
fieldset default {
fields: title, text
}
rank-profile post inherits default {
rank-type text: about
rank-type title: about
first-phase {
expression: nativeRank(title, text)
}
}
}
您的搜索定义文件是什么样的?我怀疑您已将文本内容放在 "attribute" 字段中,该字段默认为 "word match" 语义。您可能需要 "text match" 语义,这意味着您需要将内容放在 "index" 类型字段中。
https://docs.vespa.ai/documentation/reference/search-definitions-reference.html#match
您使用的 "MATCHES" 运算符将您的输入解释为正则表达式,它功能强大,但速度较慢,因为它将正则表达式应用于所有属性(对 https://swtch.com/~rsc/regexp/regexp4.html 之类的进一步优化是可能但目前尚未实施)。
我正在尝试对某些文档的某个字段进行全文搜索,我正在寻找您关于如何执行此操作的建议。我第一次尝试做这种类型的请求:
GET http://localhost:8080/search/?query=lord+of+the+rings
但它向我返回的文档中的字段是完全匹配的,并且除了给定的字符串外不包含其他信息,所以我尝试了 YQL 中的等效项:
GET http://localhost:8080/search/?yql=SELECT * FROM site WHERE text CONTAINS "lord of the rings";
我得到了完全相同的结果。但是当进一步阅读文档时,我发现了 MATCHES 指令,它确实通过执行这种请求给了我似乎正在寻找的结果:
GET http://localhost:8080/search/?yql=SELECT * FROM site WHERE text MATCHES "lord of the rings";
虽然我不知道为什么,对于这种类型的一些请求我遇到了这种类型的超时错误:
{
"root": {
"id": "toplevel",
"relevance": 1,
"fields": {
"totalCount": 0
},
"errors": [
{
"code": 12,
"summary": "Timed out",
"source": "site",
"message": "Timeout while waiting for sc0.num0"
}
]
}
}
所以我通过添加大于默认超时值解决了这个问题:
GET http://localhost:8080/search/?yql=SELECT * FROM site WHERE text MATCHES "lord of the rings";&timeout=20000
我的问题是,我是否以正确的方式进行全文搜索,我该如何改进它?
编辑:这是相应的搜索定义:
search site {
document site {
field text type string {
stemming: none
normalizing: none
indexing: attribute
}
field title type string {
stemming: none
normalizing: none
indexing: attribute
}
}
fieldset default {
fields: title, text
}
rank-profile post inherits default {
rank-type text: about
rank-type title: about
first-phase {
expression: nativeRank(title, text)
}
}
}
您的搜索定义文件是什么样的?我怀疑您已将文本内容放在 "attribute" 字段中,该字段默认为 "word match" 语义。您可能需要 "text match" 语义,这意味着您需要将内容放在 "index" 类型字段中。
https://docs.vespa.ai/documentation/reference/search-definitions-reference.html#match
您使用的 "MATCHES" 运算符将您的输入解释为正则表达式,它功能强大,但速度较慢,因为它将正则表达式应用于所有属性(对 https://swtch.com/~rsc/regexp/regexp4.html 之类的进一步优化是可能但目前尚未实施)。