Utilisation des annotations Hibernate Search (principalement @Field(index = Index.TOKENIZED)
) J'ai indexé un certain nombre de champs liés à une classe de mine persistante appelée Compound. J'ai mis en place la recherche de texte sur tous les champs indexés, en utilisant le MultiFieldQueryParser
, qui a jusqu'ici fonctionné très bien.La correspondance générique de Lucene échoue sur les notations chimiques (?)
Parmi les champs indexés et interrogeables est un champ appelé CompoundName, avec des valeurs de l'échantillon:
3-Hydroxyflavone
6,4'-Dihydroxyflavone
Quand je cherche une ou l'autre de ces valeurs dans sa totalité le composé apparenté les instances sont renvoyées. Cependant, des problèmes se produisent lorsque j'utilise le nom partiel et présenter des caractères génériques:
- recherche de
3-Hydroxyflav*
donne toujours le coup correct, mais - recherche de
6,4'-Dihydroxyflav*
ne parvient pas à trouver quoi que ce soit.
Maintenant que je suis tout à fait nouveau pour Lucene/Hibernate recherche, je ne suis pas tout à fait sûr où regarder ce point .. Je pense qu'il pourrait avoir quelque chose à voir avec la présente '
dans la deuxième requête , mais je ne sais pas comment procéder .. Dois-je regarder dans Tokenizers/Analyzers/QueryParsers ou quelque chose d'autre entièrement?
Ou est-ce que quelqu'un peut me dire comment je peux faire correspondre la deuxième recherche générique, de préférence sans rompre le comportement de MultiField-search? J'utilise Hibernate-Search 3.1.0.GA & Lucene-core 2.9.3.
Certains bits de code pertinents pour illustrer mon approche actuelle:
parties pertinentes de la classe indexée composé:
@Entity
@Indexed
@Data
@EqualsAndHashCode(callSuper = false, of = { "inchikey" })
public class Compound extends DomainObject {
@NaturalId
@NotEmpty
@Length(max = 30)
@Field(index = Index.TOKENIZED)
private String inchikey;
@ManyToOne
@IndexedEmbedded
private ChemicalClass chemicalClass;
@Field(index = Index.TOKENIZED)
private String commonName;
...
}
Comment je recherche actuellement sur les champs indexés:
String[] searchfields = Compound.getSearchfields();
MultiFieldQueryParser parser =
new MultiFieldQueryParser(Version.LUCENE_29, searchfields, new StandardAnalyzer(Version.LUCENE_29));
FullTextSession fullTextSession = Search.getFullTextSession(getSession());
FullTextQuery fullTextQuery =
fullTextSession.createFullTextQuery(parser.parse("searchterms"), Compound.class);
List<Compound> hits = fullTextQuery.list();
Pour votre information, j'ai vérifié rapidement comment le StandardAnalyzer tokenizes vos exemples. "3-Hydroxyflavone" semble tomber sous la règle du produit mentionné ci-dessus. Il devient un seul jeton "3-hydroxyflavone". "6,4'-Dihydroxyflavone" d'autre part devient deux jetons "6,4" et "dihydroxyflavone". – Hardy
Wow, merci! J'essayais juste d'utiliser Luke ici pour tester la même chose. Gues cela signifie que j'ai besoin d'utiliser un autre analyseur? (J'ai essayé de mettre le champ à UN_TOKENIZED, mais cela casse même le premier exemple de recherche ..) – Tim
Il semble que le StandardTokenizer divise les mots en apostrophes .. Cela identifie au moins le problème, mais il me faudra du temps pour le réparer ceci .. :) Merci pour l'aide! – Tim