2009-09-30 5 views
1

J'ai 3 enregistrements dans l'index Lucene.Aide nécessaire à la commande des résultats de recherche

L'enregistrement 1 contient les soins de santé dans le champ de titre. Le dossier 2 contient des soins de santé et des assurances dans le domaine de la description, mais pas ensemble. Le dossier 3 contient l'assurance-maladie dans le champ du nom de l'entreprise.

Lorsqu'un utilisateur recherche pour l'assurance maladie, je veux montrer les dossiers dans l'ordre suivant dans les résultats de recherche ...

a.Record # 3 --- car il contient à la fois les mots de l'entrée ensemble (ie.as une phrase) b.Record # 1 c.Record # 2

Pour d'autres termes, correspondance exacte de tous les mots clés doit être donné plus de poids que les matchs de mots-clés individuels.

Comment puis-je y parvenir en lucene?

Merci.

+0

L'enregistrement 1 ne contient pas un du terme de requête "assurance" et vous souhaitez qu'il soit classé au # 2. Est-ce exact? –

Répondre

1

Vous pouvez utiliser expression + slop comme le dit bajafresh4life, mais il ne pourra pas correspondre à n'importe quoi si les termes sont plus que slop apart.

Une alternative légèrement plus compliquée consiste à construire une requête booléenne qui recherche explicitement la phrase (avec ou sans slop) et chacun des termes dans la phrase. Par exemple. approche

"healthcare insurance" OR healthcare OR insurance 

pertinence normale Lucene genre vous donnera ce que vous voulez, et ne manquera pas de la manière que le « grand slops » sera.

Vous pouvez également amplifier des champs individuels de sorte que, par exemple, le titre soit plus lourd que la description ou le nom de la société. Cela a besoin d'une requête encore plus compliquée, mais vous donne beaucoup plus de contrôle sur la commande ...

title:"healthcare insurance"^2 OR title:healthcare^2 OR title:insurance^2 
OR description:"healthcare insurance" OR ... 

Il peut être assez difficile à obtenir les poids à droite, et vous pouvez avoir à jouer avec eux pour obtenir exactement ce que vous voulez (par exemple dans l'exemple que je viens de donner, vous pourriez ne pas vouloir augmenter les termes individuels du titre), mais quand vous le faites fonctionner, c'est plutôt joli :-)

1

Réécrivez la requête avec une phrase + facteur de pente. Donc, si la requête est:

healthcare insurance 

vous pouvez réécrire comme:

"healthcare insurance"~100 

Les documents qui ont les mots « santé » et « assurance » plus à proximité les uns des autres seront plus marqués. Dans ce cas, puisque le facteur de slop est de 100, les documents qui ont les deux mots mais qui sont distants de plus de 100 ne correspondent pas.

La réécriture de la requête implique la manipulation des objets Term dans un BooleanQuery. Prenez tous les termes, créez un PhraseQuery et définissez un facteur de pente.

+0

Merci pour vos précieuses contributions, bajafresh4life.I vais essayer cette approche. –