Как я могу автоматически преобразовать все объекты Lucene TermQuery в PrefixQuery? - PullRequest
0 голосов
/ 21 февраля 2020

Я использую QueryParser с StandardAnalyzer для анализа queryString. С этой настройкой, если я ищу "key short", он не будет совпадать с текстом "keyboard shortcut".

Я думаю, это потому, что queryString "key short" анализируется как BooleanQuery(TermQuery("key"), TermQuery("short")). Если бы я хотел, чтобы оно совпадало с "keyboard shortcut", мне пришлось бы искать "key* short*". Я бы хотел, чтобы QueryParser сделал это для меня автоматически, ie выдает: BooleanQuery(PrefixQuery("key"), PrefixQuery("short")) при получении queryString "key short".

Это правильный подход? Если так, как я должен go сделать это?

1 Ответ

0 голосов
/ 08 мая 2020

Я никогда не находил «правильного» решения для этого, поэтому я реализовал хак, который добавляет символы подстановки к отдельным словам в необработанном запросе и затем передает их анализатору:

private static final Pattern QUERY_WORD_PATTERN = Pattern.compile("(?<= |^)(?!AND|OR)(\\w+)(?= |$)");

...

String processedQuery = String.format("%s OR %s",
    QUERY_WORD_PATTERN.matcher(queryString).replaceAll("$1*"),
    queryString);

Query query = new QueryParser(CONTENTS_FIELD, analyzer).parse(processedQuery);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...