如何在 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 之类的进一步优化是可能但目前尚未实施)。