2011-06-03 5 views
2

Nous utilisons une application de recherche de livre. Il est implémenté par la recherche hibernate.quel analyseur est bon pour ma situation? hibernate search case

entité du livre est défini comme suit:

@Entity 
@Indexed 
public class Book{ 
@DocumentId 
private Integer UID; 
@Field 
private String title; 

@Field 
private String description; 
...} 

Si un nom de livre de recherche de l'utilisateur, par exemple, des livres avec le titre ou la description contient Microsoft, l'accès ou Microsoft Access 2007, ils entrée 2007 est revenu. C'est ce que nous attendions. Certains des livres sont totalement indépendants en raison du mot-clé 2007. Je cherche une solution pour comprendre l'importance de chaque mot-clé. Dans ce cas, 2007 est moins important dans la recherche. Mais pour cette recherche, il n'y a pas de différence pour Microsoft, l'accès ou 2007.

Le deuxième cas d'utilisateur: Y at-il un bon analyseur qui peut utiliser dans l'indexation et l'interrogation pour prendre en charge plusieurs phrases? Je pensais que l'analyseur par défaut de la recherche d'hibernation ne faisait que scinder les mots de recherche en un seul mot?

Si la recherche des mots est Microsoft Access 2007, les résultats ont meilleur score si elles contiennent « Microsoft Access »,

l'autre exemple de recherche: « ville lac salé », « Etats-Unis », les résultats ne sont pas attendus si seulement assortir le sel, la ville ou le lac ou au moins, ils devraient être derrière les résultats avec "Salt Lake City".

Quelqu'un peut-il me donner quelques indices?

merci!

Répondre

0

Lucene devrait déjà escompter des termes qui se produisent fréquemment et ne font donc pas de discrimination entre les documents. Si vous voulez augmenter cet effet, vous avez quelques choix:

  1. Modifier la fonction de similarité de la valeur par défaut, et utilisez la nouvelle fonction de poids termes différemment
  2. termes Boost faible df (haute idf) dans la requête en recherchant d'abord le nombre de documents qui contiennent un terme donné, et en ajustant le poids de ce terme en conséquence
  3. Ecrivez un classificateur qui peut a priori décider quels termes ne seront pas aussi efficaces (par ex., numéros de l'année), et ajustez leur poids en conséquence
  4. Utilisez quelque chose comme WordNet ou Wikipedia comme source de phrases (p. ex. compétences en leadership) que vous indexez en un seul jeton. Cela impliquera un TokenStream modifié tel que configuré par votre analyseur.
0

Je ne sais pas comment différencier un bon 2007 d'un mauvais. Une chose que vous pourriez faire est d'utiliser un analyseur qui ignore les nombres pour la description mais utilise un analyseur régulier pour le titre. De cette façon, seuls les numéros dans le titre seront ramassés. En pratique, ce n'est pas un analyseur complet mais un simple filtre que vous pouvez écrire et ajouter à la pile de l'analyseur.

Vous pouvez également indexer deux fois la description, en ignorant les chiffres et en les ignorant. Vous pouvez alors jouer avec le facteur d'amplification au moment de la requête pour rechercher les deux champs mais donner une priorité basse à celui avec des nombres. Une autre solution consiste à ignorer certains modèles numériques dans votre filtre personnalisé (par exemple, les numéros de style d'année, les chiffres à un chiffre, etc.): ce serait le type le plus commun de numéros bruyants que vous voudriez ignorer (c'est ce que j'irais pour le premier je pense).

En ce qui concerne la recherche de phrase, il suffit d'utiliser un PhraseQuery par Lucene ou utiliser plus convivial Hibernate Search DSL,

Query luceneQuery = mythQB 
    .phrase() 
    .onField("history") 
    .matching("Thou shalt not kill") 
     .createQuery(); 

Le doc entier pour la DSL requête est here

+0

Emmanuel, ce n'est pas une question de nombre. Je l'ai juste fait comme exemple. Ce que je veux dire, c'est que lorsque certains mots sont moins importants, certains mots sont vraiment importants. Dites "compétences en leadership". Le leadership est plus important que les compétences. Nous pouvons supposer que l'utilisateur recherche quelque chose à propos du leadership, et ensuite des compétences. avec moi? Le livre de compétences en programmation n'apparaîtra donc pas en haut. –

+0

Vous voulez une recherche sémantique. Peut-être qu'un autre produit conviendra mieux à votre facture. Pour moi, l'algorithme de similitude est assez bon dans la plupart des cas pour m'apporter des livres de compétences en leadership au sommet en utilisant l'approche tokenisée habituelle. Au moins assez bon que je n'ai jamais eu à explorer les moteurs de recherche sémantiques. –

Questions connexes