Comment puis-je obtenir la liste des termes à partir d'un champ spécifique dans Lucene?
J'ai un index à partir d'un large corpus avec plusieurs champs. Un seul de ces champs contiennent du texte.
J'ai besoin d'extraire les mots uniques à partir de l'ensemble de l'index sur ce champ.
Quelqu'un sait-il comment je peux le faire avec Lucene en java?
Vous êtes à la recherche pour terme des vecteurs (un ensemble de toutes les paroles qui étaient sur le terrain et le nombre de fois que chaque mot a été utilisé, à l'exclusion des mots vides). Vous allez utiliser IndexReader de getTermFreqVector(docid, terrain) pour chaque document dans l'index, et de remplir un HashSet avec eux.
L'alternative serait d'utiliser termes() et choisir seulement les conditions pour le domaine qui vous intéresse:
Ce n'est pas la solution optimale, vous êtes en train de lire, puis en écartant tous les autres domaines. Il y a une classe Fields dans Lucene 4, qui renvoie modalités(champ) que pour un seul domaine.
Je sais que cette fonction. Mais j'ai besoin des mots uniques à travers l'ensemble du corpus. pas par document. oui, merci je suis en utilisant les termes() mais il me donne tout ce qui a été index. Je ne pouvais trouver un endroit pour le dire de choisir seulement les termes d'un champ spécifique. avez-vous une référence? si (terme.champ().equals("field_name")) {...} pour le champ que vous voulez 🙂 Même sur Lucene 3, vous n'avez pas à analyser les conditions de tous les champs de cette. Cela semble être sans-papiers, mais reader.terms(new Term(fieldName, termText)) sera de retour le Term-s ordonnée par nom de champ, et parmi les termes du même champ commandé par le terme de texte. Donc, si vous utilisez terms.term(fieldName, "") ci-dessus, et break à la première occasion où !term.field().equals(fieldName), vous avez exactement ce que tu voulais. Mais puisque c'est sans papiers, n'est-ce pas une pause d'une journée? Autant que je le vois de Lucene propre WildcardQuery construire sur cela aussi, et il est peu probable que Lucene 3 changera beaucoup plus. Pour quelle raison avez-vous déclarer la variable term comme final? Toute la performance, la raison?
Si vous utilisez la Lucene 4.0 api, vous avez besoin pour obtenir les champs de l'indice lecteur. Les Champs puis offre le moyen d'obtenir les conditions pour chaque champ dans l'index. Voici un exemple de la façon de le faire:
Même résultat, juste un peu plus propre, est d'utiliser le LuceneDictionary dans le lucene-suggest paquet. Il prend soin d'un champ qui ne contiennent pas de termes en retournant un BytesRefIterator.EMPTY. Qui vous permettra d'économiser de NPE 🙂
Les réponses à l'aide de TermsEnum et terms.next() ont un subtil par un bug. C'est parce que le TermsEnum déjà des points pour le premier terme, de sorte while(terms.next()) sera la cause de la première période pour être ignorée.
Au lieu d'utiliser une boucle for:
TermEnum terms = reader.terms();for(Term term = terms.term(); term !=null; terms.next(), term = terms.term()){//do something with the term}
De modifier le code de la accepté de répondre:
IndexReader reader =IndexReader.open(index);TermEnum terms = reader.terms();Set<String> uniqueTerms =newHashSet<String>();for(Term term = terms.term(); term !=null; terms.next(), term = terms.term()){if(term.field().equals("field_name")){
uniqueTerms.add(term.text());}}
Vous êtes à la recherche pour terme des vecteurs (un ensemble de toutes les paroles qui étaient sur le terrain et le nombre de fois que chaque mot a été utilisé, à l'exclusion des mots vides). Vous allez utiliser IndexReader de getTermFreqVector(docid, terrain) pour chaque document dans l'index, et de remplir un
HashSet
avec eux.L'alternative serait d'utiliser termes() et choisir seulement les conditions pour le domaine qui vous intéresse:
Ce n'est pas la solution optimale, vous êtes en train de lire, puis en écartant tous les autres domaines. Il y a une classe
Fields
dans Lucene 4, qui renvoie modalités(champ) que pour un seul domaine.oui, merci je suis en utilisant les termes() mais il me donne tout ce qui a été index. Je ne pouvais trouver un endroit pour le dire de choisir seulement les termes d'un champ spécifique. avez-vous une référence?
si (terme.champ().equals("field_name")) {...} pour le champ que vous voulez 🙂
Même sur Lucene 3, vous n'avez pas à analyser les conditions de tous les champs de cette. Cela semble être sans-papiers, mais
reader.terms(new Term(fieldName, termText))
sera de retour leTerm
-s ordonnée par nom de champ, et parmi les termes du même champ commandé par le terme de texte. Donc, si vous utilisezterms.term(fieldName, "")
ci-dessus, etbreak
à la première occasion où!term.field().equals(fieldName)
, vous avez exactement ce que tu voulais. Mais puisque c'est sans papiers, n'est-ce pas une pause d'une journée? Autant que je le vois de Lucene propreWildcardQuery
construire sur cela aussi, et il est peu probable que Lucene 3 changera beaucoup plus.Pour quelle raison avez-vous déclarer la variable
term
commefinal
? Toute la performance, la raison?OriginalL'auteur milan
Si vous utilisez la Lucene 4.0 api, vous avez besoin pour obtenir les champs de l'indice lecteur. Les Champs puis offre le moyen d'obtenir les conditions pour chaque champ dans l'index. Voici un exemple de la façon de le faire:
Finalement, pour la nouvelle version de Lucene, vous pouvez obtenir la chaîne de caractères à partir de la BytesRef appel:
au lieu de
Si vous voulez obtenir le document de fréquence, vous pouvez le faire :
OriginalL'auteur pokeRex110
Même résultat, juste un peu plus propre, est d'utiliser le
LuceneDictionary
dans lelucene-suggest
paquet. Il prend soin d'un champ qui ne contiennent pas de termes en retournant unBytesRefIterator.EMPTY
. Qui vous permettra d'économiser de NPE 🙂OriginalL'auteur RobAu
Les réponses à l'aide de
TermsEnum
etterms.next()
ont un subtil par un bug. C'est parce que leTermsEnum
déjà des points pour le premier terme, de sortewhile(terms.next())
sera la cause de la première période pour être ignorée.Au lieu d'utiliser une boucle for:
De modifier le code de la accepté de répondre:
OriginalL'auteur Owen Pauling