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