[英]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被
BooleanQuery
为ConstantScoreQueries
的BooleanQuery
,它实际上不是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.