2010-10-13 7 views
0

Je souhaite utiliser un seul champ pour indexer le titre et le corps du document, afin d'améliorer les performances."booster" différentes instances du même champ dans un document lucene

L'idée était de faire quelque chose comme ceci:

Field title = new Field("text", "alpha bravo charlie", Field.Store.NO, Field.Index.ANALYZED); 
title.setBoost(3) 
Field body = new Field("text", "delta echo foxtrot", Field.Store.NO, Field.Index.ANALYZED); 
Document doc = new Document(); 
doc.add(title); 
doc.add(body); 

Et puis je pouvais faire une TermQuery unique au lieu d'un BooleanQuery pour deux champs distincts.

Cependant, il s'avère qu'un coup de pouce de champ est le multiple de tout le coup de pouce des champs du même nom dans le document. Dans mon cas, cela signifie que les deux champs ont un boost de 3.

Y at-il un moyen que je puisse obtenir ce que je veux sans avoir à utiliser deux champs différents? Une façon serait d'ajouter plusieurs fois le champ title au document, ce qui augmente la fréquence du terme. Cela fonctionne, mais semble incroyablement mort cérébrale.

Je connais aussi le payloads, mais cela semble être un peu exagéré pour ce que je cherche.

Des idées?

+0

Pouvez-vous aller dans quelques détails sur les problèmes de performance que vous essayez de surmonter? Je n'ai jamais rencontré de problèmes en utilisant BooleanQuery sur deux champs séparés. – Snekse

+0

Je ne l'ai pas testé, mais je suis sûr que cela prend plus de temps pour rechercher '(titre: bravo OU corps: bravo)' que pour 'texte: bravo' – itsadok

Répondre

0

Si vous souhaitez retirer une page du livre de Google (au moins leur ancien livre), vous pouvez créer des index distincts: un pour les corps de document, un autre pour les titres. Je suppose qu'il y a un champ stocké qui pointe vers un vrai UID pour chaque document réel.

La réponse alternative est d'écrire des implémentations personnalisées de [Similarité] [1] pour obtenir le comportement souhaité. Malheureusement, je trouve que Lucene a souvent besoin de cette personnalisation des problèmes uniques surgissent.

[1]: http://lucene.apache.org/java/3_0_2/api/all/org/apache/lucene/search/Similarity.html#lengthNorm(java.lang.String, int)

+0

Juste pensé à une autre raison, vous pouvez garder ces des éléments de données dans des champs séparés ou des index séparés: s'ils partagent le même nom de champ dans le même index, les quantités massiques de contenu dans Body pourraient faire des ravages sur la fréquence de terme pour Title. Des mots comme Menu, Table ou Accueil (si vous utilisez des pages Web de base) commenceraient à apparaître plus souvent en donnant moins de poids à ces mots dans le titre. – Snekse

0

Vous pouvez index titre et le corps séparément avec le champ de titre dopé par une valeur souhaitée. Ensuite, vous pouvez utiliser MultiFieldQueryParser pour rechercher plusieurs champs.

Bien que, sur le plan technique, la recherche de multiples champs prend plus de temps, généralement même avec cette surcharge, Lucene a tendance à être extrêmement rapide (de l'ordre de quelques dizaines ou centaines de millisecondes.)

Questions connexes