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.


Ответы (0 шт):