Как внедрить/использовать анализатор в Xapian 1.4.5?

Я искал в Google, но не нашел никакой подсказки, связанной с реализацией анализатора в Xapian, даже Xapian может не поддерживать использование анализатора, такого как lucene. Другими словами, я не могу расширить поддержку на китайском языке. Я прав?

Я искал в Xapian C++ API, нашел только TermGenerator, который может быть связан с извлечением слова . Существует флаг с именем FLAG_CJK_NGRAM, он может разбить слово CJK UTF-8, скажем, ABCD, он разделит его на AB, BC, CD и A, B, C, D. Это очень просто и понятно. Я полагаю, мне нужно более точное решение, кажется, мне нужно внедрить или перенести зрелое решение (например, jieba) к Хапиану. Я прав?


person MoreFreeze    schedule 17.04.2018    source источник


Ответы (1)


TermGenerator (и QueryParser, который идет рука об руку) поддерживает разделение ngram CJK, что, возможно, является тем, что вы ищете, добавляя FLAG_CJK_NGRAM. Для TermGenerator это используется путем вызова set_flags(); для QueryParser вы передаете флаги в parse_query() (это обычно для логического ИЛИ в новых флагах с FLAG_DEFAULT, иначе вы отключите функции, которые, вероятно, захотите оставить).

Во всех остальных отношениях вы должны иметь возможность использовать Xapian как обычно, например, в практический пример из руководства "Начало работы". (Обратите внимание, что хотя пример написан на Python, он будет работать и на других языках с оболочкой, а также непосредственно на C++. исходный код руководства по началу работы содержит примеры кода на некоторых других языках.)

Из документации FLAG_CJK_NGRAM:

Если эта функция включена, диапазоны символов CJK разбиваются на униграммы и биграммы, причем униграммы несут позиционную информацию. Символы, отличные от CJK, разбиваются на слова как обычно.

Если вы хотите сделать что-то еще, то в настоящее время вам нужно написать собственный код генерации терминов и разбора запросов.

person James Aylett    schedule 18.04.2018
comment
Я ценю вашу помощь. Я пробовал FLAG_CJK_NGRAM, но это очень простой TermGenerator, который просто разбивает слово ABCD на AB, BC, CD и A, B, C, D. Поэтому я полагаю, что мне нужно реализовать собственную генерацию терминов. Спасибо, в любом случае. - person MoreFreeze; 23.04.2018
comment
Да, если вы хотите что-то более мощное, вам нужно будет написать свой собственный. Я считаю, что последняя версия несколько более тонкая, но не обязательно достаточно, чтобы делать то, что вы хотите. - person James Aylett; 25.04.2018