Domanda

Ho due domande riguardanti colpo evidenziatore dotato di Lucene apache:

  1. vedere questa funzione potrebbe spiegare l'uso del parametro flusso di token.

  2. Ho diversi documenti di grandi dimensioni Lucene che contiene molti campi e ogni campo ha alcune stringhe in esso. Ora ho trovato il documento più rilevanti per una determinata query. Ora, questo documento è stato trovato perché più parole nella query potrebbero essere abbinati con le parole del documento. Voglio sapere quali parole nella query causato questo. Quindi, per questo ho intenzione di utilizzare Lucene Hit evidenziatore. Esempio: se la query è "pelle medico delhi" e il documento intitolato "dermatologo" contiene le parole "pelle" e "Dottore" poi dopo l'evidenziazione dovrei essere in grado di separare "pelle" e "dottore" dalla query. Ho cercato di scrivere il codice per questo ormai da diverse settimane. Non in grado di ottenere ciò che voglio. Potresti aiutarmi per favore?

Grazie in anticipo.

Aggiornamento:

Approccio corrente: Creo una query che contiene tutte le parole del documento.

Field[] field = doc.getFields("description");
String desc = "";
for (int j = 0; j < field.length; ++j) {
     desc += field[j].stringValue() + " ";
}

Query q = qp.parse(desc);
QueryScorer scorer = new QueryScorer(q, reader, "description");
Highlighter highlighter = new Highlighter(scorer);

String fragment = highlighter.getBestFragment(analyzer, "description", text);

Si lavora per documenti di piccole dimensioni, ma non funziona per documenti di grandi dimensioni. Il seguente stacktrace si ottiene.

    org.apache.lucene.search.BooleanQuery$TooManyClauses: maxClauseCount is set to 1024
    at org.apache.lucene.search.BooleanQuery.add(BooleanQuery.java:152)
    at org.apache.lucene.queryParser.QueryParser.getBooleanQuery(QueryParser.java:891)
    at org.apache.lucene.queryParser.QueryParser.getBooleanQuery(QueryParser.java:866)
    at org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1213)
    at org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1167)
    at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:182)

E 'evidente che l'approccio è irragionevole per documenti di grandi dimensioni. Cosa si deve fare per correggere questo?

A proposito sto usando corrispondente FuzzyQuery.

È stato utile?

Soluzione

EDIT:. Aggiunto alcuni dettagli circa spiegano ()

Alcuni introduzione generale: Il Lucene Highlighter ha lo scopo di trovare frammenti di testo da un documento di successo, e per evidenziare i token corrispondenti alla query.

  1. Pertanto, il parametro TokenStream viene utilizzato per rompere il testo ha colpito in token. L'evidenziatore ai goal poi punteggi ogni token, al fine di segnare frammenti e scegli frammenti e gettoni da evidenziare.
  2. Credo che si sta facendo male. Se tutto quello che vogliamo fare è capire quali termini di query sono stati abbinati nel documento, è necessario utilizzare il spiegare () metodo . In sostanza, dopo aver istanziato un ricercatore, uso:

Explanation expl = searcher.explain(query, docId);

String asText = expl.toString();

String asHtml = expl.toHtml();

DocID è il documento id grezzo dai risultati della ricerca.

Solo se avete bisogno i frammenti e / o mette in evidenza, è necessario utilizzare l'evidenziatore. Se si desidera continuare a utilizzare l'evidenziatore, seguire Nicola di Hrychan consiglio . Attenzione, però, mentre descrive il Lucene 2.4.1 API -. Se si utilizza una versione più avanzata, si consiglia di utilizzare "QueryScorer", dove dice "SpanScorer"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top