Lucene не учитывается порядок слов в QueryParser, как быть?
У меня есть такой текст:
TextWord[0]: war
TextWord[1]: force
TextWord[2]: force
TextWord[3]: war
И я хочу сделать такой запрос, чтобы результатом было только "war force" и без слов между этими словами.
Я пробовал:
Query query = parser.parse(" \"war force\"~0x ");
Query query = parser.parse(" \"war force\"~0 ");
Query query = parser.parse("war AND force");
Query query = parser.parse("war force");
И у меня выводиться и "war force" и "force war", хотя мне важно, чтобы результат был только такой: "war force", чтобы учитывался порядок слов. Использую Lucene 8.9.0
Подскажите какой запрос можно попробовать?
Мой код:
Analyzer customAnalyzer = CustomAnalyzer.builder()
.withTokenizer("standard")
.build();
QueryParser parser = new QueryParser("tags", customAnalyzer);
Query query = parser.parse("\"war force\"~0 AND NOT \"force war\"");
IndexSearcher searcher = new IndexSearcher(reader); //Поиск по индексу, который в памяти
TopDocs docs = searcher.search(query, 10);
System.out.println(" "); //Для отступа в консоли
FastVectorHighlighter highlighter = new FastVectorHighlighter(); //Улучшенный highlighter
FieldQuery fieldQuery = highlighter.getFieldQuery(query);
FieldTermStack stack = new FieldTermStack(reader, 0, "tags", fieldQuery);
TermInfo myTermInfo = stack.pop();
while(myTermInfo != null){
System.out.println("word[" + myTermInfo.getPosition() + "]: " + myTermInfo.getText());
myTermInfo = stack.pop();
}
Создание индекса:
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(new StandardAnalyzer());
try (IndexWriter writer = new IndexWriter(this.memoryIndex, indexWriterConfig)) {
Document doc = new Document();
FieldType type = new FieldType();
type.setStoreTermVectors(true);
type.setStoreTermVectorPositions(true);
type.setStoreTermVectorOffsets(true);
type.setStored(true);
type.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
Field fieldStore = new Field("tags", content, type); //В поле "tags" записываются данные из переменной content
doc.add(fieldStore);
writer.addDocument(doc);
}
Использую QueryParser для поиска, и для индексации использую StandardAnalyzer, а для запроса использую customAnalyzer.