Lucene.Net:搜索未找到所有值
Lucene.Net:search does not find all the values
使用Lucene.Net 3.0.3。
我有几个 classes 具有这样的字段:
public class Test1
{
public string Name {get;set;}
}
我如何创建索引:
var doc = new Document();
doc.Add(new Field(KEYWORDS_FIELD_NAME, someUid, CultureInfo.InvariantCulture), Field.Store.YES, Field.Index.ANALYZED));
我如何创建查询:
var analyzer=new RussianAnalyzer(Version.LUCENE_30);
private Query ParseQuery(string queryString,Analyzer analyzer)
{
var classQuery = new BooleanQuery();
var hs = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
foreach(var par in Parameters)
{
classQuery.add(new TermQuery(new Term(KEYWORDS_FIELD_NAME,par.ClassName.ToLower()),Occur.SHOULD);
hs.add(par.PropertyName);
}
var parser=new MultiFieldQueryParse(Version.LUCENE_30, hs.ToArray(), analyzer);
var multiQuery=parser.Parse(queryString.Ttim());
var result=new BooleanQuery
{
{classQuery,Occur.MUST},
new BooleanClause(multiQuery,Occur.MUST)
};
return result;
}
和搜索请求:
var query=ParseQuery(queryString,analuzer);
using (var searcher = new IndexSearcher(luceneDirectory))
{
var hits = searcher.Search(query, null, 10000);
}
在搜索索引中有一个 "Name" 属性 of class Test1。
一些属性的值是:
40002
40001
4001
4009
和其他类似值。
当我输入“4001”时,搜索产生了一个结果。这很适合我。
但是,当我输入“400”时,搜索没有找到任何值。
我知道这个值不在索引中,但我希望在这种情况下搜索会找到 "similar" 值:4001、40002 和其他值。
这能做到吗?我究竟做错了什么?
谢谢。
P.S。它适用于“400*”和没有 RegexQuery 的 MultiFieldQuery。它每 30% 变慢。
当我使用 RegexQuery 时 - 70-80%。
尝试搜索 400*,您还需要 WildCardQuery
不是布尔查询
使用Lucene.Net 3.0.3。 我有几个 classes 具有这样的字段:
public class Test1
{
public string Name {get;set;}
}
我如何创建索引:
var doc = new Document();
doc.Add(new Field(KEYWORDS_FIELD_NAME, someUid, CultureInfo.InvariantCulture), Field.Store.YES, Field.Index.ANALYZED));
我如何创建查询:
var analyzer=new RussianAnalyzer(Version.LUCENE_30);
private Query ParseQuery(string queryString,Analyzer analyzer)
{
var classQuery = new BooleanQuery();
var hs = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
foreach(var par in Parameters)
{
classQuery.add(new TermQuery(new Term(KEYWORDS_FIELD_NAME,par.ClassName.ToLower()),Occur.SHOULD);
hs.add(par.PropertyName);
}
var parser=new MultiFieldQueryParse(Version.LUCENE_30, hs.ToArray(), analyzer);
var multiQuery=parser.Parse(queryString.Ttim());
var result=new BooleanQuery
{
{classQuery,Occur.MUST},
new BooleanClause(multiQuery,Occur.MUST)
};
return result;
}
和搜索请求:
var query=ParseQuery(queryString,analuzer);
using (var searcher = new IndexSearcher(luceneDirectory))
{
var hits = searcher.Search(query, null, 10000);
}
在搜索索引中有一个 "Name" 属性 of class Test1。 一些属性的值是:
40002 40001 4001 4009
和其他类似值。
当我输入“4001”时,搜索产生了一个结果。这很适合我。 但是,当我输入“400”时,搜索没有找到任何值。 我知道这个值不在索引中,但我希望在这种情况下搜索会找到 "similar" 值:4001、40002 和其他值。
这能做到吗?我究竟做错了什么? 谢谢。
P.S。它适用于“400*”和没有 RegexQuery 的 MultiFieldQuery。它每 30% 变慢。 当我使用 RegexQuery 时 - 70-80%。
尝试搜索 400*,您还需要 WildCardQuery 不是布尔查询