à l'aide de frapper surligneur dans lucene
J'ai deux questions concernant frappé surligneur fourni avec apache lucene:
-
voir cette fonction
pourriez-vous expliquer l'utilisation de token paramètre stream. -
J'ai plusieurs grosses lucene document contenant plusieurs champs et chaque champ a certaines chaînes. Maintenant j'ai trouvé le plus de documents pertinents pour une requête particulière. Maintenant, ce document a été trouvé, parce que plusieurs mots dans la requête peut avoir correspondu avec les mots dans le document. Je veux savoir ce que les mots dans la requête causé cela. Donc, pour cela, je prévois d'utiliser Lucene Frappé Surligneur.
Exemple: si la requête est "médecin de la peau delhi" et le document intitulé "dermatologue" contient les mots "de la peau" et "médecin" puis, après avoir mis en surbrillance, je devrais être capable de séparer "la peau" et "médecin" de la requête. J'ai essayé d'écrire le code pour que cela pour plusieurs semaines maintenant. Pas en mesure d'obtenir ce que je veux. Pourriez-vous m'aider s'il vous plaît?
Merci d'avance.
Mise à jour:
Approche Actuelle:
J'ai créer une requête contenant tous les mots dans le document.
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);
Il travaille pour des documents de petite taille, mais ne fonctionne pas pour les documents de grande taille. La suite stacktrace est obtenu.
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)
Il est évident que l'approche est déraisonnable pour des documents volumineux. Ce qui doit être fait pour corriger cela?
BTW, je suis en utilisant FuzzyQuery de correspondance.
OriginalL'auteur Rohit Banga | 2010-03-09
Vous devez vous connecter pour publier un commentaire.
EDIT: ajout de quelques détails au sujet de l'expliquer().
Certaines introduction générale:
La Lucene Surligneur est destinée à trouver des fragments de texte à partir d'un hit de document,
et pour mettre en évidence les jetons correspondant à la requête.
En gros, après avoir instancié un moteur de recherche, utilisation:
Explanation expl = searcher.explain(query, docId);
String asText = expl.toString();
String asHtml = expl.toHtml();
docId est le cru le document d'identité à partir des résultats de la recherche.
Seulement si vous avez besoin de la des extraits et/ou de faits saillants, vous devez utiliser le Surligneur. Si vous voulez continuer à utiliser le surligneur, suivez Nicolas Hrychan conseils. Méfiez-vous, même si, comme il le décrit la Lucene 2.4.1 API - Si vous utilisez une version plus avancée, vous devez utiliser "QueryScorer" où il dit "SpanScorer" .
Veuillez voir mon montage sur expliquer().
ok cool. qu'en est getDetail() la méthode.
La Lucene Explication a une structure récursive. toString() et toHtml() vous donner l'explication complète de l'arbre. getDetails() vous donne un sous-arbre de l'arbre à la fois. Je voudrais essayer de regarder l'arbre complet d'abord, et seulement si c'est trop compliqué d'aller à la sous-arbres.
Voici une version plus complète: stackoverflow.com/questions/1742124/...
OriginalL'auteur Yuval F