2010-07-26 5 views
2

Je souhaite trouver les positions de début et de fin d'une correspondance à partir d'une requête lucene (Version 3.0.2 pour Java). Il semble que je devrais être en mesure d'obtenir cette information de Highlighter ou FastVectorHighligher, mais ces classes semblent seulement retourner un fragment de texte avec le texte pertinent en surbrillance. Est-il possible d'obtenir cette information, soit avec un surligneur, soit avec le ScoreDoc lui-même?Recherche du début et de la fin d'une correspondance avec Lucene

Mise à jour: Je trouve cette question connexe: Finding the position of search hits from Lucene

Mais je pense que la réponse par Allasso ne fonctionnera pas pour moi parce que mes questions sont des phrases, pas de termes individuels.

Répondre

5

Si j'étais vous je prendrais juste le code de FastVectorHighlighter. Code pertinent est FieldTermStack:

 List<string> termSet = fieldQuery.getTermSet(fieldName); 
     VectorHighlightMapper tfv = new VectorHighlightMapper(termSet);  
     reader.GetTermFreqVector(docId, fieldName, tfv); // <-- look at this line 

     string[] terms = tfv.GetTerms(); 
     foreach (String term in terms) 
     { 
      if (!termSet.Contains(term)) continue; 
      int index = tfv.IndexOf(term); 
      TermVectorOffsetInfo[] tvois = tfv.GetOffsets(index); 
      if (tvois == null) return; // just return to make null snippets 
      int[] poss = tfv.GetTermPositions(index); 
      if (poss == null) return; // just return to make null snippets 
      for (int i = 0; i < tvois.Length; i++) 
       termList.AddLast(new TermInfo(term, tvois[i].GetStartOffset(), tvois[i].GetEndOffset(), poss[i])); 

La chose importante il y a reader.GetTermFreqVector(). Comme je l'ai dit, FastVectorHighlighter fait déjà du legwork que je ne ferais que copier, mais si vous voulez, cet appel GetTermPositions devrait faire tout ce dont vous avez besoin.

+0

J'aurais dû préciser que j'utilise Lucene Java 3.0.2. Pourtant, je vais regarder le code pour FastVectorHighlighter est de voir si je peux obtenir ce dont j'ai besoin à partir de là. –

+0

@Mike: Désolé, j'ai pensé que la syntaxe C# était assez proche de Java. En tout cas, le TermPositionsVector devrait faire ce que vous voulez. Puisque vous voulez mettre en évidence des phrases, ce sera un peu plus difficile (vous aurez besoin de trouver celles qui sont juste l'une à côté de l'autre) mais cela ne devrait pas être trop mauvais. – Xodarap

Questions connexes