Может кто-нибудь объяснить разницу между различными анализаторами в Lucene? Я получаю исключение maxClauseCount, и я понимаю, что я могу избежать этого, используя KeywordAnalyzer, но я не хочу меняться с StandardAnalyzer, не понимая проблем, связанных с анализаторами. Большое спасибо.
Сравнение Lucene Analyzers
Ответ 1
В общем, любой анализатор в Lucene является фильтром токенизатора + штокмер + стоп-слова.
Tokenizer разбивает ваш текст на куски, и, поскольку различные анализаторы могут использовать разные токенизаторы, вы можете получать разные потоки токенов вывода, то есть последовательности фрагментов текста. Например, KeywordAnalyzer
, о котором вы упомянули, не разбивает текст вообще и берет все поле как один токен. В то же время StandardAnalyzer
(и большинство других анализаторов) используют пробелы и пунктуацию как точки разделения. Например, для фразы "Я очень доволен" это создаст список [ "i", "am", "very", "happy" ] (или что-то в этом роде). Для получения дополнительной информации о конкретных анализаторах/токенизаторах см. Его Java Docs.
Stemmers используются, чтобы получить базу соответствующего слова. Это сильно зависит от используемого языка. Например, для предыдущей фразы на английском языке будет создано нечто вроде [ "i", "be", "veri", "happi" ], а для французского "Je suis très heureux" - какой-то французский анализатор (например, SnowballAnalyzer
, инициализированный "французским" ), создаст [ "je", "être", "tre", "heur" ]. Разумеется, если вы будете использовать анализатор одного языка для публикации текста в другом, будут использоваться правила с другого языка, и стример может привести к неправильным результатам. Это не обязательно для всей системы, но результаты поиска могут быть менее точными.
KeywordAnalyzer
не использует никаких стволовых клеток, он передает все поля без изменений. Итак, если вы собираетесь искать несколько слов в тексте на английском языке, использовать этот анализатор не рекомендуется.
Остановить слова - самые частые и почти бесполезные слова. Опять же, это сильно зависит от языка. Для английского языка эти слова "a", "the", "I", "be", "have" и т.д. Фильтры стоп-слов удаляют их из потока токенов, чтобы снизить шум в результатах поиска, поэтому, наконец, наша фраза "I 't very happy" с StandardAnalyzer
будет преобразован в список [ "veri", "happi" ].
И KeywordAnalyzer
снова ничего не делает. Таким образом, KeywordAnalyzer
используется для таких вещей, как идентификатор или номера телефонов, но не для обычного текста.
И что касается вашего исключения maxClauseCount
, я считаю, что вы его получите при поиске. В этом случае, скорее всего, это из-за слишком сложного поискового запроса. Попробуйте разделить его на несколько запросов или использовать более низкоуровневые функции.