2013-03-02 76 views
14

在Lucene中,我們可以使用TermQuery來搜索帶有字段的文本。我想知道如何在一堆字段或所有可搜索字段中搜索關鍵字?如何搜索所有字段?

回答

9

兩種方法

1)指數時間的方法:使用包羅萬象的場。這只不過是在所有字段中添加所有文本(來自您輸入文檔的全部文本),並將生成的巨大文本放在單個字段中。您必須在編制索引時添加一個附加字段,以充當全面的字段。

2)搜索時間方法:使用BooleanQuery來組合多個查詢,例如TermQuery實例。這些多個查詢可以形成爲涵蓋所有目標字段。

Example檢查文章結尾處。

如果您在運行時知道目標字段列表,請使用方法2。否則,你必須使用第一種方法。

+0

感謝良好的大局觀解釋。第一種方法是在同一索引中存儲不同類型產品時使用的方法,例如打印機與監視器,其中每個文檔存在不同的字段,但我希望使用簡單搜索字符串進行「全文本」搜索並將所有匹配的產品。 – nothingisnecessary 2017-02-10 02:10:52

20

另一種方法是使用MultiFieldQueryParser,它不需要索引比已有的索引更多的東西,也不需要組合不同的查詢。

您可以提供您想要搜索的字段列表以及您的查詢,就這些了。

MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
       Version.LUCENE_41, 
       new String[]{"title", "content", "description"}, 
       new StandardAnalyzer(Version.LUCENE_41)); 

Query query = queryParser.parse("here goes your query"); 

這是我會怎麼用Java編寫的原Lucene的圖書館這樣做。我不確定MultiFieldQueryParser是否也在lucene.net中可用。

+0

MultiFieldQueryParser是一個優雅的方法.. :) – phani 2013-03-02 16:04:51

+0

謝謝,你的答案也不錯;)+1 – javanna 2013-03-02 16:14:23

3

另一種簡單的方法來使用「MultifieldQueryParser」是用IndexReader.FieldOption.ALL在查詢所有字段進行搜索。

以下是c#中的示例。

Directory directory = FSDirectory.Open(new DirectoryInfo(HostingEnvironment.MapPath(VirtualIndexPath))); 

    //get analyzer 
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29); 

    //get index reader and searcher 
    IndexReader indexReader__1 = IndexReader.Open(directory, true); 
    Searcher indexSearch = new IndexSearcher(indexReader__1); 

    //add all possible fileds in multifieldqueryparser using indexreader getFieldNames method 
    dynamic queryParser = new MultiFieldQueryParser(Version.LUCENE_29, indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer); 
    dynamic query = queryParser.Parse(Criteria); 
    TopDocs resultDocs = null; 

    //perform search 
    resultDocs = indexSearch.Search(query, indexReader__1.MaxDoc()); 
    dynamic hits = resultDocs.scoreDocs; 

click here要看看我的透水答案相同quesiton在vb.net

+0

我沒有看到在這裏使用鴨打字的關鍵(即'動態'關鍵字)。也許你想用'var'來使用類型interence? – 2016-11-04 10:13:46

相關問題