使用WildcardQuery的Lucene MultiFieldQuery

时间:2013-11-11 15:06:10

标签: lucene lucene.net

目前我遇到Lucene搜索问题(版本2.9)。

我有一个搜索词,我需要在几个字段中使用它。因此,我必须使用MultiFieldQueryParser。另一方面,我必须使用WhildcardQuery(),因为我们的客户想要在短语中搜索一个术语(例如“CMH”应匹配“KRC250 / CMH / 830 / T / H”)。

我尝试用星号('/')替换斜杠('*'),并使用带有星号的BooleanQuery作为术语。 不幸的是哪有成功。

有没有人有任何想法?

2 个答案:

答案 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);

我的客户喜欢它: - )