[英]How to do search of part of a word using lucene?
这里是Ershad。我正在研究Lucene。 现在我可以搜索单词了。但是如果输入单词的一部分,我将无法获得结果。 您能提出建议做什么吗?
对于索引,我正在使用以下代码
writer = new IndexWriter(directory, new StandardAnalyzer(), true);
writer.SetUseCompoundFile(true);
doc.Add(Field.UnStored("text", parseHtml(html)));
doc.Add(Field.Keyword("path", relativePath));
writer.AddDocument(doc);
为了搜索,我正在使用以下代码。
Query query = QueryParser.Parse(this.Query,"text",new StandardAnalyzer());
// create the result DataTable
this.Results.Columns.Add("title", typeof(string));
this.Results.Columns.Add("sample", typeof(string));
this.Results.Columns.Add("path", typeof(string));
// search
Hits hits = searcher.Search(query);
this.total = hits.Length();
如果您参考Lucene查询解析器语法文档 ,则会发现您可以在查询末尾附加星号( *
),以匹配所有以特定字符串开头的单词。 例如,假设您想获得同时提及“毛毛虫”和“双体船”的结果。 您的搜索查询将是“ cat *”。
但是,如果您不能直接控制搜索查询(例如,如果用户正在输入自己的搜索查询),则QueryParser
可能需要一些QueryParser
。 我的经验完全是Java的Lucene版本。 希望原理与Lucene.NET相同。
在Java中,您可以扩展QueryParser
类并覆盖其newTermQuery(Term)
方法。 传统上,此方法将返回TermQuery
对象。 但是,子类将返回PrefixQuery
。 例如:
public class PrefixedTermsQueryParser extends QueryParser {
// Some constructors...
protected Query newTermQuery(Term term) {
return new PrefixQuery(term);
}
}
我不确定要在Lucene.NET中重写哪些方法,但是我肯定必须有类似的方法。 查看其文档 ,似乎QueryParser类具有一个称为GetFieldQuery
的方法。 也许这是您必须重写的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.