我们在ascii空间上拆分用户查询以创建weakAnd(...)
。
用户输入的“ Watch【Docudrama】”不包含空格-但会引发错误。
问题:应该使用空格旁边的哪些代码点来拆分查询?
YQL(失败):
select * from post where text contains "Watch【Docudrama】" limit 1;
YQL(有效):
select * from post where weakAnd(text contains "Watch",text contains "【Docudrama】") limit 1;
错误消息:
{
"root": {
"id": "toplevel",
"relevance": 1,
"fields": {
"totalCount": 0
},
"errors": [
{
"code": 4,
"summary": "Invalid query parameter",
"source": "content",
"message": "Can not add WORD_ALTERNATIVES text:[ Watch【Docudrama】(1.0) watch(0.7) ] to a segment phrase"
}
]
}
}
答案 0 :(得分:4)
确定要为此使用WAND吗?尝试将用户查询语法设置为“ any”(默认为“ all”),这将对用户提供的术语使用“ OR”运算符。这里有一个示例:https://docs.vespa.ai/documentation/reference/query-language-reference.html#userinput
拆分查询的过程称为令牌化。这是一个复杂且依赖语言的过程,Vespa使用Apache OpenNLP进行此操作(以及更多操作):https://docs.vespa.ai/documentation/linguistics.html提供了更多信息,并且还引用了执行此操作的代码。
如果您真的想使用WAND,而不是在Vespa之外重新实现查询解析逻辑,建议您创建一个Java搜索器,该搜索器将查询树降级并通过将创建的AndItem替换为WeakAndItem对其进行修改。请参见https://docs.vespa.ai/documentation/searcher-development.html和此处的代码示例:https://docs.vespa.ai/documentation/advanced-ranking.html