1

我正在尝试对某些文档的某个字段进行全文搜索,并且正在寻找您的建议。我首先尝试执行此类请求:

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)
        }
   }
}
4

1 回答 1

2

您的搜索定义文件是什么样的?我怀疑您已将文本内容放在“属性”字段中,该字段默认为“单词匹配”语义。您可能需要“文本匹配”语义,这意味着您需要将您的内容放在“索引”类型的字段中。

https://docs.vespa.ai/documentation/reference/search-definitions-reference.html#match

您正在使用的“MATCHES”运算符将您的输入解释为正则表达式,这很强大,但由于它将正则表达式应用于所有属性而速度较慢(对https://swtch.com/~rsc/regexp/之类的进一步优化regexp4.html是可能的,但目前尚未实现)。

于 2018-08-07T13:40:51.843 回答