簡體   English   中英

Lucene在多個字段上搜索,但在任何字段上都匹配

[英]Lucene search on multiple fields but match on any

我目前正在嘗試創建一個查詢,該查詢可以在4個字段上進行搜索,但在與任何字段匹配的地方返回文檔。

有人可以告訴我如何進行設置。 我已經嘗試過BooleanQuery和MultiFieldQueryParser,但沒有獲得任何成功。

    BooleanQuery booleanQuery = new BooleanQuery();
    Query query1 = new TermQuery(new Term("field1", text1));
    Query query2 = new TermQuery(new Term("field2", text2));
    Query query3 = new TermQuery(new Term("field3", text3));
    Query query4 = new TermQuery(new Term("field4", text4));
    booleanQuery.add(query1, Occur.SHOULD);
    booleanQuery.add(query2, Occur.SHOULD);
    booleanQuery.add(query3, Occur.SHOULD);
    booleanQuery.add(query4, Occur.SHOULD);


    MultiFieldQueryParser multiQueryParser = new MultiFieldQueryParser(Version.LUCENE_44, 
            new String[] {"field1", "field2", "field3", "field4"}, analyzer);

    multiQueryParser.setDefaultOperator(Operator.OR);

使用multiQueryParser將運算符設置為AND時,我得到了結果,但是使用OR卻沒有任何結果。 我認為只有在兩個字段匹配時才返回結果。

有人可以建議出什么問題嗎?

謝謝

另外,我正在尋找部分比賽或全部比賽。

完整代碼:

公共課程演示{

IndexWriter indexWriter = null;

public boolean openIndex() {
    try {
        Directory dir = FSDirectory.open(new File(indexerPath));
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);
        IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_44, analyzer);
        indexWriter = new IndexWriter(dir, iwc);
        isIndexOpen = true;
        return true;
    } catch (Exception e) {
        return false;
    }
}

public void finish() {
    try {
        indexWriter.close();
        isIndexOpen = false;
    } catch (IOException e) {
    }
}

@Override
public void addDoc(MyObject obj) {
    Document doc = new Document();
    doc.add(new TextField("field1", obj.getField1(), Field.Store.YES));
    doc.add(new TextField("field2", obj.getField2(),, Field.Store.YES));
    doc.add(new TextField("field3", obj.getField3(),, Field.Store.YES));
    doc.add(new TextField("field4", obj.getField4(),, Field.Store.YES));

    try {
        indexWriter.addDocument(doc);
    } catch (IOException e) {

    }
}

@Override
public void getResults(String text) throws ParseException, IOException {
    Directory dir = FSDirectory.open(new File(indexerPath));
    IndexReader reader = DirectoryReader.open(dir);
    StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);

    MultiFieldQueryParser multiQueryParser = new MultiFieldQueryParser(Version.LUCENE_44, 
            new String[] {"field1", "field2", "field3", "field4"}, analyzer);

    multiQueryParser.setDefaultOperator(Operator.OR);
    Query query = multiQueryParser.parse(text);
    searcher.search(query, collector);
    hits = collector.topDocs().scoreDocs;

    for (int i = 0; i < hits.length; ++i) {
        int docId = hits[i].doc;
        Document d = searcher.doc(docId);
        Log.info("\f1: "+d.get("field1") + " f2: " + d.get("field2") + 
                " f3: "+d.get("field3") + " f4: "+ d.get("field3"));
    }

    return results;
}

}

獨立的示例表示編譯並依靠外部資源來運行/演示問題的代碼。 您的代碼沒有。

這是代碼的修改后的版本,可以正常工作並演示部分匹配。

public class Demo {

    static Directory dir;

    IndexWriter indexWriter;

    public boolean openIndex() {
        try {
            dir = new RAMDirectory();
            Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);
            IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_44, analyzer);
            indexWriter = new IndexWriter(dir, iwc);

            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public void finish() {
        try {
            indexWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void addDoc() {
        Document doc = new Document();
        doc.add(new TextField("field1", "val1", Field.Store.YES));
        doc.add(new TextField("field2", "val2", Field.Store.YES));
        doc.add(new TextField("field3", "val3", Field.Store.YES));
        doc.add(new TextField("field4", "val4", Field.Store.YES));

        try {
            indexWriter.addDocument(doc);
            indexWriter.commit();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void printResults(Query query) throws IOException {
        IndexReader reader = DirectoryReader.open(dir);
        IndexSearcher searcher = new IndexSearcher(reader);
        TopDocs result = searcher.search(query, 5);
        System.out.println("# of results:" + result.totalHits);
        for (ScoreDoc doc : result.scoreDocs) {
            System.out.println(doc);
        }

        reader.close();
    }

    public static void main(String[] args) throws IOException, ParseException {
        Demo demo = new Demo();
        demo.openIndex();
        demo.addDoc();
        demo.finish();


        BooleanQuery booleanQuery = new BooleanQuery();
        Query query1 = new TermQuery(new Term("field1", "val1"));
        Query query2 = new TermQuery(new Term("field2", "val2"));
        Query query3 = new TermQuery(new Term("field3", "val3"));
        Query query4 = new TermQuery(new Term("field4", "val4"));
        booleanQuery.add(query1, BooleanClause.Occur.SHOULD);
        booleanQuery.add(query2, BooleanClause.Occur.SHOULD);
        booleanQuery.add(query3, BooleanClause.Occur.SHOULD);
        booleanQuery.add(query4, BooleanClause.Occur.SHOULD);
        printResults(booleanQuery);

        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);
        MultiFieldQueryParser multiQueryParser = new MultiFieldQueryParser(Version.LUCENE_44,
                    new String[] {"field1", "field2", "field3", "field4"}, analyzer);
        multiQueryParser.setDefaultOperator(QueryParser.Operator.OR);

        Query mfQuery = multiQueryParser.parse("field1:val1 field2:val2 field3:val3 field4:val4");
        printResults(mfQuery);

        Query mfQuery2 = multiQueryParser.parse("field1:val* field2:x field3:y field4:z");
        printResults(mfQuery2);

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM