2013-08-19 59 views
1

當我用短語搜索「PH1 PH2」找到包含「PH1」或「PH2」文本。Lucene的示例查詢

String line = "ph1 ph2";   
QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field, analyzer); 
Query query = parser.parse(line); 

任何人都知道如何通過1)短語(「ph1 ph2」)進行搜索。示例:這是一句PH1 PH2。 2)用短語最大距離( 「PH1 PH2〜3」)。示例這個ph1是句子ph2。

P.S我用標準的Lucene索引索引我的文件。如果這個例子是沒有明確的說法http://www.lucenetutorial.com/lucene-query-syntax.html

這裏是全碼:

String index = "C:/programs/lucenedemo/index"; 
    String field = "contents";      
    IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(index))); 
    IndexSearcher searcher = new IndexSearcher(reader); 
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40); 
    //QueryParser parser = new QueryParser(Version.LUCENE_40, field, analyzer);   
    String line = "ph1 ph2";   
    QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field, analyzer); 
    Query query = parser.parse(line);      
    //doPagingSearch(searcher, query, hitsPerPage, raw, queries == null && queryString == null);   
    //doPagingSearch 

    TopDocs results = searcher.search(query, 300000); 
    ScoreDoc[] hits = results.scoreDocs;   
    System.out.println(results.totalHits); 

    for (int i=0;i<10;i++) {  
    Document doc = searcher.doc(hits[i].doc); 
     String path = doc.get("path"); 
     if (path != null) System.out.println((i+1) + ". " + path);       
    } 

    //end of doPagingSearch 
    reader.close(); 

回答

1

您可能需要使用SpanQuery。

具體來說,您可以創建一個SpanNearQuey,爲構造函數傳遞一個SpanTermQuerys數組,一個用於該短語中的每個子句,一個表示「slop」的int或最大距離(以及指示術語必須按順序)。

要搜索,使用getSpans方法對已創建的查詢。

請注意,這將爲您提供所有此類事件的列表,而不是匹配文檔的列表。根據您想要如何顯示結果,您可能需要遍歷跨度並根據文檔等對它們進行分組。

1

我不清楚您正在尋找什麼,但我相信它是一個作者:

  • "field:\"" + line + "\"":簡單的短語查詢。找到兩個相鄰的有序條件

  • "field:\"" + line + "\"~3":短語與slop查詢。爲了,但最多三個方面值得在這兩個術語的分離。

  • "field:(" + line + ")":根本不是短語查詢。簡單搜索這兩個術語。任何訂單或距離均可接受。

你可以看到在Lucene的query syntax documentation

+0

感謝上查詢語法分析進一步的選擇中, 「PH1 PH2」 istead我不得不寫 「\」 PH1 PH2 \ 「〜3」 –