Стандартный анализатор использует фильтр нижнего регистра - так что да, все ваши проиндексированные данные будут строчными:
Фильтрует StandardTokenizer с LowerCaseFilter и StopFilter, используя настраиваемый список стоп-слов.
Также имейте в виду, что это:
TermRangeQuery.newStringRange("content", "a", "f", true, true);
означает, что «a» и «f» включены в диапазон (значения true
).
Таким образом, "a" in "сильно упал" - это совпадение. Вот почему все 4 результата находятся в запросе 3. Измените третий поиск на что-то вроде этого, чтобы увидеть результат:
TermRangeQuery.newStringRange("content", "a", "b", true, true);
TermRangeQuery.newStringRange("content", "a", "b", false, false);
Этот следующий пункт не имеет прямого отношения к вашему вопросу, но может оказаться полезным. Обычно при выполнении поиска желательно использовать тот же анализатор, что и при индексации данных (есть исключения). Так, например, для поисковых запросов характерно совпадение поисковых терминов без учета регистра. Используя стандартный анализатор для поисковых терминов, вы можете достичь этого.
Существуют различные способы сделать это - вот один из способов - могут быть более приятные:
QueryParser parser = new QueryParser("content", analyzer);
Query q1 = TermRangeQuery.newStringRange("content", "b", "h", true, true);
Query query1 = parser.parse(q1.toString());
showQueryResult(1, query1);
Результаты должны Имеет смысл в свете вышесказанного.
Если вы хотите изучить, что на самом деле индексируется, я рекомендую изменить, чтобы использовать это:
org.apache.lucene.store.MMapDirectory;
и что-то вроде этого:
Directory directory = new MMapDirectory(Paths.get("E:/lucene/indexes/range_queries"));
И, во всяком случае, RAMDirectory обычно не рекомендуется - за исключением, может быть, для демонстраций.
Как только данные находятся на диске, вы можете указать на них Люка - очень полезный инструмент (с GUI) для изучения данных индекса. Он доступен в виде файла JAR (lucene-luke-8.xxjar), который можно найти в основном бинарном выпуске Lucene.
РЕДАКТИРОВАТЬ :
Если вы используйте RAMDirectory, вы также можете использовать это:
if (!DirectoryReader.indexExists(directory)) {
// index builder logic here
}
Это позволяет избежать повторного заполнения индекса дублирующимися данными.
Относительно стоп-слов: по умолчанию стандартный анализатор имеет пустой список стоп-слов. Вы можете предоставить конструктору список слов в виде org.apache.lucene.analysis.CharArraySet
:
import org.apache.lucene.analysis.CharArraySet;
...
CharArraySet myStopWords = new CharArraySet(2, true);
myStopWords .add("foo");
myStopWords .add("bar");
Analyzer analyzer = new StandardAnalyzer(myStopWords);
Или вы можете использовать один из существующих списков стоп-слов. Вот тот, для Engli sh стоп-слов:
import static org.apache.lucene.analysis.en.EnglishAnalyzer.ENGLISH_STOP_WORDS_SET;
...
Analyzer analyzer = new StandardAnalyzer(ENGLISH_STOP_WORDS_SET);