目前我对 Lucene 搜索(2.9 版)有疑问。
我有一个搜索词,我需要在多个字段中使用它。因此,我必须使用MultiFieldQueryParser
. 另一方面,我必须使用 WhildcardQuery(),因为我们的客户想要在短语中搜索一个词(例如,“CMH”应该匹配“KRC250/CMH/830/T/H”)。
我试图用星号 ( ) 替换斜线 ( '/'
)'*'
并使用BooleanQuery
带有封闭星号的术语。不幸的是,没有任何成功。
有人有什么主意吗?
目前我对 Lucene 搜索(2.9 版)有疑问。
我有一个搜索词,我需要在多个字段中使用它。因此,我必须使用MultiFieldQueryParser
. 另一方面,我必须使用 WhildcardQuery(),因为我们的客户想要在短语中搜索一个词(例如,“CMH”应该匹配“KRC250/CMH/830/T/H”)。
我试图用星号 ( ) 替换斜线 ( '/'
)'*'
并使用BooleanQuery
带有封闭星号的术语。不幸的是,没有任何成功。
有人有什么主意吗?
对不起,也许我描述的有点不对。
我拿了这样的东西:
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);
我的客户喜欢它:-)
是的,如果显示的字段是单个标记,则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
带有封闭星号的意思,如果你可以包含代码来阐明这一点,它可能会有所帮助。