简体   繁体   English

使用Lucene.NET 3.0.3获取ConstantsScoreQuery的所有条款

[英]Get all Terms of ConstantsScoreQuery using Lucene.NET 3.0.3

i am using Lucene.Net v3.0.3 with C# and have an issue retrieving all Terms from a ConstantScoreQuery. 我在C#中使用Lucene.Net v3.0.3,并且在从ConstantScoreQuery检索所有条款时遇到问题。 The Method ExtractTerms seems to be uncoded. 方法ExtractTerms似乎未编码。

The goal is to get all Terms matching a wildcardsearch (using QueryParser) I tried to use WildcardTermEnum class but this failed using a combined Wildcard search like erf* && poli* 目标是获取所有与通配符搜索匹配的条款(使用QueryParser),我尝试使用WildcardTermEnum类,但是使用诸如erf * && poli *的组合通配符搜索失败

How can i solve this? 我该如何解决?

Thank you. 谢谢。

You WildcardQuery is rewriten as a BooleanQuery of ConstantScoreQueries , which are not really a Query but a Filter. 您的WildcardQuery被BooleanQueryConstantScoreQueriesBooleanQuery ,它实际上不是Query而是过滤器。 That is why ExtractTerms won't get you anything. 这就是为什么ExtractTerms不会为您带来任何好处的原因。

Heres one way to do it, while I agree it isnt ideal, its the best I could quickly put up. 这是一种做到这一点的方法,尽管我同意这不是理想的方法,但我可以很快提出它的最佳方法。 This will only works for prefix queries, you'd have to add more logic if you want it to work with any MultiTermQueries types. 这仅适用于前缀查询,如果要使其与任何MultiTermQueries类型一起使用,则必须添加更多逻辑。

You have to do this BEFORE the query gets rewritten, or it wont work. 您必须在查询被重写之前执行此操作,否则它将无法正常工作。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lucene.Net.Search;
using Lucene.Net.Index;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Documents;
using Lucene.Net.Search.Spans;
using Lucene.Net.Analysis;
using Lucene.Net.Store;
using System.IO;
using Lucene.Net.QueryParsers;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            RAMDirectory dir = new RAMDirectory();
            IndexWriter iw = new IndexWriter(dir, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED);

            Document d = new Document();
            Field f = new Field("text", "This is some erfand erftyas poliot polioasd poliasdas data to test the wild card term enums. Lets see how it works out.", Field.Store.YES, Field.Index.ANALYZED);
            d.Add(f);

            iw.AddDocument(d);

            iw.Commit();
            IndexReader reader = iw.GetReader();
            QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "text", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30));            
            // parser.MultiTermRewriteMethod = MultiTermQuery.CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE;

            Query q= parser.Parse("(poli* && erf*) && test* && (asd* || res*) && aterm");
            Query q2 = parser.Parse("poli*");

            //var rq = q.Rewrite(reader);
            //ISet<Term> terms = new HashSet<Term>();
            //rq.ExtractTerms(terms);

            List<PrefixQuery> prefixQueries = null;
            if (q is PrefixQuery)
            {
                prefixQueries = new List<PrefixQuery>();
                prefixQueries.Add(q as PrefixQuery);
            }
            else if(q is BooleanQuery)
            {
                prefixQueries = ExtractQueries(q as BooleanQuery);
            }

            foreach (var pq in prefixQueries)
            {
                WildcardTermEnum termEnum = new WildcardTermEnum(reader, new Term(pq.Prefix.Field, pq.Prefix.Text + "*"));

                if (termEnum.Term != null)
                    Console.WriteLine(termEnum.Term.Text);
                while (termEnum.Next())
                {
                    Console.WriteLine(termEnum.Term.Text);
                }
            }

            Console.ReadLine();
        }

        private static List<PrefixQuery>  ExtractQueries (BooleanQuery query)
        {
            List<PrefixQuery> queries = new List<PrefixQuery>();
            foreach (var q in query)
            {
                if (q.Query is BooleanQuery)
                {
                    queries.AddRange(ExtractQueries(q.Query as BooleanQuery));
                }
                else
                {
                    if (q.Query is PrefixQuery)
                    {
                        queries.Add(q.Query as PrefixQuery);
                    }
                }
            }
            return queries;
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM