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