2013-03-02 78 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

相关问题