首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lucene.NET "OR“

Lucene.NET "OR“
EN

Stack Overflow用户
提问于 2010-01-13 21:31:12
回答 4查看 3.7K关注 0票数 8

我该如何在Lucene.NET中执行"OR“操作呢?基本上,我得到的是一个in数组,我想返回某个特定字段包含任意值的任何记录。我以前只使用一个值来做这件事,但是现在我想转换下面的代码,这样MetaDataID就是一个可能值的数组,而不是一个值。

代码语言:javascript
复制
if (MetaDataID.Length > 0)
    completeQuery.Add(new QueryParser("MetaData", new StandardAnalyzer()).Parse(MetaDataID), BooleanClause.Occur.MUST);
EN

回答 4

Stack Overflow用户

发布于 2012-04-18 04:33:07

在组合Lucene查询时,如果您希望任何索引记录包含多个可能值中的任何一个,并且还必须满足附加条件,请创建多个布尔查询对象。

对于第一组"OR“条件:

代码语言:javascript
复制
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);

现在与查询中的其他条件相结合

代码语言:javascript
复制
BooleanQuery booleanQueryOuter = new BooleanQuery();
booleanQueryOuter.add(booleanQueryInner, BooleanClause.Occur.MUST);
booleanQueryOuter.add(boolenaQueryOtherConditions, BooleanClause.Occur.MUST);

现在,只有当索引记录满足内部"OR“组中的一个条件,并且满足”其他条件“查询中的条件时,才会返回这些记录。

票数 12
EN

Stack Overflow用户

发布于 2010-01-14 20:31:05

您需要使用BooleanClause.Occur.SHOULD而不是BooleanClause.Occur.MUST

例如:

代码语言:javascript
复制
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);
票数 4
EN

Stack Overflow用户

发布于 2012-02-08 21:34:46

当你真的想要解析你的查询时,你只需要为你的查询选择正确的Analyzer和格式。

StandardAnalyzer不是一个好的选择,当你索引的是英文全文以外的任何东西,特别是在你的情况!它能过滤出数字!

在您的情况下,最短的解决方案是创建一个分析器,该分析器在分隔符上进行标记,并将您的对象组合成一个字符串。

示例:

创建一个在典型分隔符上拆分的令牌化器和一个使用它的分析器

代码语言:javascript
复制
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)

代码语言:javascript
复制
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);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2056908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档