目前我遇到Lucene搜索问题(版本2.9)。
我有一个搜索词,我需要在几个字段中使用它。因此,我必须使用MultiFieldQueryParser
。另一方面,我必须使用WhildcardQuery(),因为我们的客户想要在短语中搜索一个术语(例如“CMH”应匹配“KRC250 / CMH / 830 / T / H”)。
我尝试用星号('/'
)替换斜杠('*'
),并使用带有星号的BooleanQuery
作为术语。
不幸的是哪有成功。
有没有人有任何想法?
答案 0 :(得分:0)
是的,如果显示的字段是单个标记,则需要将setAllowLeadingWildcard
设置为true,如:
parser.setAllowLeadingWildcard(true);
Query query = parser.parse("*CMH*");
然而:
你没有提到如何分析这个领域。默认情况下,使用StandardAnalyzer
,它会以斜杠(或星号,索引数据时)将其拆分为标记。如果您正在使用此类分析,则只需创建一个TermQuery
搜索" cmh" (StandardAnalyzer
包含LowercaseFilter
),或者只是:
String[] fields = {"this", "that", "another"};
QueryParser parser = MultiFieldQueryParser(Version.LUCENE_29, fields, analyzer) //Assuming StandardAnalyzer
Query simpleQuery = parser.parse("CMH");
//Or even...
Query slightlyMoreComplexQuery = parser.parse("\"CMH/830/T\"");
我不明白BooleanQuery
带有封闭星星的意思,如果你可以包含代码来阐明它,那可能会有所帮助。
答案 1 :(得分:0)
对不起,也许我说的有点不对。
我拿了这样的东西:
BooleanQuery bq = new BooleanQuery();
foreach (string field in fields)
{
foreach (string tok in tokArr)
{
bq.Add(new WildcardQuery(new Term(field, " *" + tok + "* ")), BooleanClause.Occur.SHOULD);
}
}
return bq;
但不幸的是它没有用。
我已经像这样修改了它
string newterm = string.Empty;
string[] tok = term.Split(new[] { ' ', '/' }, StringSplitOptions.RemoveEmptyEntries);
tok.ForEach(x => newterm += x.EnsureStartsWith(" *").EnsureEndsWith("* "));
var version = Lucene.Net.Util.Version.LUCENE_29;
var analyzer = new StandardAnalyzer(version);
var parser = new MultiFieldQueryParser(version, fields, analyzer);
parser.SetDefaultOperator(QueryParser.Operator.AND);
parser.SetAllowLeadingWildcard(true);
return parser.Parse(newterm);
我的客户喜欢它: - )