2009-06-17 9 views
2

Nous prévoyons d'utiliser lucene comme FTI-service. Nous voulons, entre autres, construire un tag-index, basé sur un attribut-tag de nos documents qui contient simplement des balises délimitées par des espaces. Maintenant, pour suggérer des complétions de tags, il serait bon d'avoir un moyen d'accéder à tous les mots-clés uniques d'un index donné. Lucene doit pouvoir le faire en interne, car il l'utilise pour compléter des requêtes similaires afin de les réécrire en utilisant OU.liste d'accès de mots-clés de l'index lucene

Des suggestions?

Répondre

0

Si vous essayez de compléter un tag, vous n'avez pas besoin de toutes les balises uniques, vous avez besoin des balises qui correspondent à ce que l'utilisateur a déjà entré. Cela peut être fait avec une requête générique, floue, span ou proefix selon le besoin.

5

Utilisez IndexReader.terms pour obtenir toutes les valeurs de termes (et nombre de documents) pour votre zone de tag.

1

La complétion des balises doit provenir de (a) une requête de préfixe sur votre liste de balises (comme pytho *), ou (b) via une requête sur un champ atomisé par ngram (par exemple, Lucene indexera python comme p, py, pyt, pytho, python dans un champ séparé.) Ces deux solutions vous permettent de faire des requêtes d'achèvement de balises à la volée. Ce que vous suggérez (et ce que la réponse de Coady vous apportera) est une approche plus déconnectée ou quelque chose que vous ne voulez pas vraiment exécuter au moment de la requête. C'est également très bien - les dictionnaires de balises ne sont pas censés être en temps réel - mais sachez que parcourir les termes de IndexReader n'est pas censé être une opération de "requête-temps".

+0

Je vais regarder dans les IndexReader.terms. Cependant, je ne pense pas que vos hypothèses soient correctes. Si lucene peut étendre les termes au moment de la requête, alors il est au moins suffisamment rapide en interne pour produire une liste de termes pour un terme partiel donné. Cette fonctionnalité m'intéresse, pour éviter d'avoir un second index de tags uniques. – deets

1

Veillez à utiliser directement les termes de l'index. Si vous avez activé l'indexation pendant l'indexation, toutes les chaînes drôles commenceront à apparaître dans la liste des termes. La "beauté" devient "beauti", "créer" est transformé en "creat" et ainsi de suite.

1

Vous devez faire deux choses:

1) Lorsque vous créez votre document à l'index, assurez-vous d'utiliser « ANALYZED »

doc.add(new Field("tags", tags, Field.Store.NO, Field.Index.ANALYZED)); 

2) Utilisez une requête booléenne et ou tous les termes :

BooleanQuery query = new BooleanQuery(); 

for(String tag : tags){ 
    query.add(new TermQuery("tags", tag), BooleanClause.Occur.SHOULD); 
} 
TopDocs docs = searcher.search(query, null, searchLimit);