用于在Vespa引擎中拆分用户查询的字符

时间:2019-09-20 20:32:03

标签: vespa

我们在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"
      }
    ]
  }
}

1 个答案:

答案 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