我该如何在Lucene.NET中执行"OR“操作呢?基本上,我得到的是一个in数组,我想返回某个特定字段包含任意值的任何记录。我以前只使用一个值来做这件事,但是现在我想转换下面的代码,这样MetaDataID就是一个可能值的数组,而不是一个值。
if (MetaDataID.Length > 0)
completeQuery.Add(new QueryParser("MetaData", new StandardAnalyzer()).Parse(MetaDataID), BooleanClause.Occur.MUST);发布于 2012-04-18 04:33:07
在组合Lucene查询时,如果您希望任何索引记录包含多个可能值中的任何一个,并且还必须满足附加条件,请创建多个布尔查询对象。
对于第一组"OR“条件:
BooleanQuery booleanQueryInner = new BooleanQuery();
Query query1 = new TermQuery(new Term("id", "<id 1>"));
Query query2 = new TermQuery(new Term("id", "<id 2>"));
Query query3 = new TermQuery(new Term("id", "<id 3>"));
Query query4 = new TermQuery(new Term("id", "<id 4>"));
booleanQueryInner.add(query1, BooleanClause.Occur.SHOULD);
booleanQueryInner.add(query2, BooleanClause.Occur.SHOULD);
booleanQueryInner.add(query3, BooleanClause.Occur.SHOULD);
booleanQueryInner.add(query4, BooleanClause.Occur.SHOULD);现在与查询中的其他条件相结合
BooleanQuery booleanQueryOuter = new BooleanQuery();
booleanQueryOuter.add(booleanQueryInner, BooleanClause.Occur.MUST);
booleanQueryOuter.add(boolenaQueryOtherConditions, BooleanClause.Occur.MUST);现在,只有当索引记录满足内部"OR“组中的一个条件,并且满足”其他条件“查询中的条件时,才会返回这些记录。
发布于 2010-01-14 20:31:05
您需要使用BooleanClause.Occur.SHOULD而不是BooleanClause.Occur.MUST
例如:
BooleanQuery booleanQuery = new BooleanQuery();
Query query1 = new TermQuery(new Term("id", "<id 1>"));
Query query2 = new TermQuery(new Term("id", "<id 2>"));
booleanQuery.add(query1, BooleanClause.Occur.SHOULD);
booleanQuery.add(query2, BooleanClause.Occur.SHOULD);发布于 2012-02-08 21:34:46
当你真的想要解析你的查询时,你只需要为你的查询选择正确的Analyzer和格式。
StandardAnalyzer不是一个好的选择,当你索引的是英文全文以外的任何东西,特别是在你的情况!它能过滤出数字!
在您的情况下,最短的解决方案是创建一个分析器,该分析器在分隔符上进行标记,并将您的对象组合成一个字符串。
示例:
创建一个在典型分隔符上拆分的令牌化器和一个使用它的分析器
using System.IO;
using System.Linq;
using Lucene.Net.Analysis;
namespace Project.Analysis
{
public class TermTokenizer : LetterTokenizer
{
// some static separators
private static readonly char[] NONTOKEN_CHARS = new char[] { ',', ';', ' ', '\n', '\t' };
protected override bool IsTokenChar(char c)
{
return !NONTOKEN_CHARS .Contains(c);
}
}
public class LowerCaseTermAnalyzer : Analyzer
{
public override TokenStream TokenStream(string fieldName, TextReader reader)
{
return new LowerCaseFilter(new TermTokenizer(reader));
}
}
}在解析器中使用新的分析器
(您需要包括System.Linq)
if (MetaDataID.Length > 0)
{
// the search term will look like this: "1;5;7"
string searchTerm = string.Join(";", MetaDataID);
// the query parser uses the new Analyzer
QueryParser parser = new QueryParser("MetaData",new LowerCaseTermAnalyzer());
// the parsed search term (only used internally) will look like this:
// "MetaData:1 MetaData:5 MetaData:7", which is essentially what you want to achieve
completeQuery.Add(new parser.Parse(MetaDataID), BooleanClause.Occur.MUST);
}https://stackoverflow.com/questions/2056908
复制相似问题