Символы для разделения пользовательского запроса в движке Vespa - PullRequest
1 голос
/ 20 сентября 2019

Мы разбили пользовательский запрос по пробелам 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 Ответ

4 голосов
/ 21 сентября 2019

Вы уверены, что вам нужно использовать 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

...