Как реализовать SpanQuery с MultiFieldQuery в Java с помощью Lucene - PullRequest
0 голосов
/ 29 декабря 2018

В настоящее время я хочу реализовать SpanQuery с MultiFieldQuery для нечетких фраз, но у меня есть проблемы с ним.

Я пытался использовать MultiFieldQuery с BooleanQuery.Он работает только частично, он может искать нечеткую фразу, но фраза не идет ни в коем случае, например, мой индекс содержит это «Проверить это».Когда я ищу «Проверить», он возвращает хит и показывает это «Проверить это».Это результат, который я хочу.Однако, когда я ищу «Проверить это», он также возвращает хит и показывает это «Проверить это».В этом случае он должен потерпеть неудачу, потому что «out» - это второе слово.

Я также пытался использовать SpanQuery.Выше сценарий не произойдет, если я использую этот метод.Однако я могу искать только одно поле.В то время как я хочу искать с несколькими полями.

private static TopDocs searchInFuzzyPhrase(String textToFind, String textToFind1, IndexSearcher searcher, int slop)
        throws Exception {
    // Create search query in phrase    
    Analyzer analyzer = new StandardAnalyzer();
    //multifield
    MultiFieldQueryParser query = new MultiFieldQueryParser(new String[]
    { "FULL_NAME", "BRAND_NAME", "DISPLAY_NAME", "DISPLAY_NAME_SYNONYM" }, analyzer);
    query.setPhraseSlop(slop);
    BooleanQuery bQuery = new BooleanQuery.Builder()
            .add(query.parse(textToFind + "~"), BooleanClause.Occur.MUST)
            .add(query.parse(textToFind1 + "~"), BooleanClause.Occur.MUST)
            .build();       
    //span
    SpanQuery[] clauses = new SpanQuery[2];
    clauses[0] = new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("DISPLAY_NAME", textToFind)));
    clauses[1] = new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("DISPLAY_NAME", textToFind1)));
    SpanNearQuery sQuery = new SpanNearQuery(clauses, slop, true);

    TopDocs hits = searcher.search(bQuery, 1);
    return hits;
}

Используя пример ранее.«Проверить это» Когда я выполняю поиск «Проверить это» с помощью MultiField + BooleanQuery, он возвращает хит, однако это не то, что я хочу.

Когда я выполняю поиск "Проверьте их с помощью SpanQuery, он выдаст пропущенное. Это то, что я хочу частично, но это относится только к одному полю. Я пытаюсь применить его ко многим полям

1 Ответ

0 голосов
/ 02 января 2019

Проблема в том, что пролеты работают только на одном поле.Это довольно понятно, поскольку едва ли существует представление о позициях между различными полями.

Вам нужно следовать тому же коду, который вам нужен, вам просто нужно расширить его на весь список полей, которые у вас есть.

Например, для каждой строки в вашем списке "FULL_NAME", "BRAND_NAME", "DISPLAY_NAME", "DISPLAY_NAME_SYNONYM" вам нужно создать SpanQuery, как вы делали в примере, а затем объединить их все в одну BooleanQuery с Occur.SHOULD

...