0

C# で Lucene.Net v3.0.3 を使用していますが、ConstantScoreQuery からすべての用語を取得する際に問題があります。メソッド ExtractTerms はコード化されていないようです。

目標は、ワイルドカード検索 (QueryParser を使用) に一致するすべての用語を取得することです。WildcardTermEnum クラスを使用しようとしましたが、erf* && poli* などのワイルドカード検索を組み合わせて使用​​すると失敗しました。

どうすればこれを解決できますか?

ありがとうございました。

4

1 に答える 1

0

WildcardQuery は of として書き換えられますBooleanQueryConstantScoreQueries、これは実際にはQueryフィルターではありません。そのため、ExtractTerms では何も得られません。

理想的ではないことに同意しますが、すぐに我慢できる最善の方法です。これはプレフィックス クエリでのみ機能します。任意のMultiTermQueriesタイプで機能するようにするには、さらにロジックを追加する必要があります。

クエリが書き直されるにこれを行う必要があります。そうしないと機能しません。

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;
        }
    }
}
于 2013-04-04T18:04:05.807 に答える