繁体   English   中英

Lucene搜索语法

[英]Lucene Search Syntax

我需要帮助弄清楚在给定情况下要使用哪种查询类型。

我想我说的很对,如果我将“ FORD”一词存储在lucene Field中,并且我想找到一个完全匹配的项目,我会使用TermQuery吗?

但是,如果我要查找“ FORD”一词,那么该字段应存储为以下字段:-

“福特|本田|铃木”

如果我要搜索整个页面的内容,寻找一个短语怎么办? 例如“请帮助我”?

如果要在FORD|HONDA|SUZUKI搜索FORD,请使用Field.Index.ANALYZED进行索引,或将其存储如下以使用TermQuery

var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);
var fs = FSDirectory.Open("test.index");

//Index a Test Document
IndexWriter wr = new IndexWriter(fs, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);
var doc = new Document();

doc.Add(new Field("Model", "FORD", Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("Model", "HONDA", Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("Model", "SUZUKI", Field.Store.YES, Field.Index.NOT_ANALYZED));

doc.Add(new Field("Text", @"What if i was to search the contents of an entire page, looking for a phrase? such as ""please help me""?", 
                    Field.Store.YES, Field.Index.ANALYZED));

wr.AddDocument(doc);
wr.Commit();

var reader = wr.GetReader();
var searcher = new IndexSearcher(reader);

//Use TermQuery for "NOT_ANALYZED" fields
var result = searcher.Search(new TermQuery(new Term("Model", "FORD")), 100);
foreach (var item in result.ScoreDocs)
{
    Console.WriteLine("1)" + reader.Document(item.Doc).GetField("Text").StringValue);
}

//Use QueryParser for "ANALYZED" fields
var qp = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Text", analyzer);
result = searcher.Search(qp.Parse(@"""HELP ME"""), 100);
foreach (var item in result.ScoreDocs)
{
    Console.WriteLine("2)" + reader.Document(item.Doc).GetField("Text").StringValue);
}

TermQuery表示您要搜索术语,因为它存储在索引中,这取决于您对该字段建立索引的方式(NOT_ANALYZED,ANALYZED + WhichAnalyzer)。 它最常用于NOT_ANALYZED字段。

您也可以将TermQueryANALYZED字段一起使用,但是随后您应该知道分析器如何对输入字符串进行标记化。 下面是一个示例,以查看分析器如何标记您的输入

var text = @"What if i was to search the contents of an entire page, looking for a phrase? such as ""please help me""?";
var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30 );
//var analyzer = new WhitespaceAnalyzer();
//var analyzer = new KeywordAnalyzer();
//var analyzer = new SimpleAnalyzer();

var ts = analyzer.TokenStream("", new StringReader(text));
var termAttr = ts.GetAttribute<ITermAttribute>();

while (ts.IncrementToken())
{
    Console.Write("[" + termAttr.Term + "] " );    
}

我将问题转为横向,因此我将每个字段的多个值分别放入索引中-这应该使搜索更简单。 查看具有多个值的字段可能会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM