robar reglas pozo persona mattel comodin como canasta basica c# lucene lucene.net

c# - reglas - Obteniendo términos coincidentes en un documento cuando se busca utilizando una búsqueda con comodín



reglas del uno 2018 (2)

Estoy buscando una manera de encontrar los términos que coinciden en el documento que utiliza la búsqueda waldcard en Lucene. Usé el explicador para tratar de encontrar los términos, pero esto falló. Una parte del código relevante está debajo.

ScoreDoc[] myHits = myTopDocs.scoreDocs; int hitsCount = myHits.Length; for (int myCounter = 0; myCounter < hitsCount; myCounter++) { Document doc = searcher.Doc(myHits[myCounter].doc); Explanation explanation = searcher.Explain(myQuery, myCounter); string myExplanation = explanation.ToString(); ...

Cuando hago una búsqueda en decir micro *, los documentos se encuentran y entran al ciclo, pero myExplanation contiene NON-MATCH y ninguna otra información.

¿Cómo obtengo el término que se encontró en este documento?

Cualquier ayuda sería muy apreciada.

Saludos


Una forma es usar el resaltador; otra forma sería imitar lo que hace el resaltador reescribiendo su consulta llamando a myQuery.rewrite () con un reescritor apropiado; esto es probablemente más cercano en espíritu a lo que estabas intentando. Esto reescribirá la consulta a BooleanQuery que contiene todos los Términos coincidentes; puedes sacar las palabras de ellos con bastante facilidad. ¿Es eso suficiente para ponerte en marcha?

Esta es la idea que tenía en mente; perdón por la confusión re: reescribir las consultas; no es realmente relevante aquí.

TokenStream tokens = TokenSources.getAnyTokenStream(IndexReader reader, int docId, String field, Analyzer analyzer); CharTermAttribute termAtt = tokens.addAttribute(CharTermAttribute.class); while (tokens.incrementToken()) { // do something with termAtt, which holds the matched term }


class TVM : TermVectorMapper { public List<string> FoundTerms = new List<string>(); HashSet<string> _termTexts = new HashSet<string>(); public TVM(Query q, IndexReader r) : base() { List<Term> allTerms = new List<Term>(); q.Rewrite(r).ExtractTerms(allTerms); foreach (Term t in allTerms) _termTexts.Add(t.Text()); } public override void SetExpectations(string field, int numTerms, bool storeOffsets, bool storePositions) { } public override void Map(string term, int frequency, TermVectorOffsetInfo[] offsets, int[] positions) { if (_termTexts.Contains(term)) FoundTerms.Add(term); } } void TermVectorMapperTest() { RAMDirectory dir = new RAMDirectory(); IndexWriter writer = new IndexWriter(dir, new Lucene.Net.Analysis.Standard.StandardAnalyzer(), true); Document d = null; d = new Document(); d.Add(new Field("text", "microscope aaa", Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS)); writer.AddDocument(d); d = new Document(); d.Add(new Field("text", "microsoft bbb", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); writer.AddDocument(d); writer.Close(); IndexReader reader = IndexReader.Open(dir); IndexSearcher searcher = new IndexSearcher(reader); QueryParser queryParser = new QueryParser("text", new Lucene.Net.Analysis.Standard.StandardAnalyzer()); queryParser.SetMultiTermRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE); Query query = queryParser.Parse("micro*"); TopDocs results = searcher.Search(query, 5); System.Diagnostics.Debug.Assert(results.TotalHits == 2); TVM tvm = new TVM(query, reader); for (int i = 0; i < results.ScoreDocs.Length; i++) { Console.Write("DOCID:" + results.ScoreDocs[i].Doc + " > "); reader.GetTermFreqVector(results.ScoreDocs[i].Doc, "text", tvm); foreach (string term in tvm.FoundTerms) Console.Write(term + " "); tvm.FoundTerms.Clear(); Console.WriteLine(); } }