0

目前我对 Lucene 搜索(2.9 版)有疑问。

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

我试图用星号 ( ) 替换斜线 ( '/')'*'并使用BooleanQuery带有封闭星号的术语。不幸的是,没有任何成功。

有人有什么主意吗?

4

2 回答 2

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

我的客户喜欢它:-)

于 2013-11-11T17:27:40.443 回答
0

是的,如果显示的字段是单个标记,则setAllowLeadingWildcard需要设置为 true,例如:

parser.setAllowLeadingWildcard(true);
Query query = parser.parse("*CMH*");

然而:

您没有提到如何分析该字段。默认情况下,StandardAnalyzer使用 ,这会将其拆分为斜杠(或星号,在索引数据时)的标记。如果您正在使用这种分析,您可以简单地创建一个TermQuery搜索“cmh”(StandardAnalyzer包括 a 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带有封闭星号的意思,如果你可以包含代码来阐明这一点,它可能会有所帮助。

于 2013-11-11T17:17:08.633 回答