La version utilisée de Lucene (Java) est 4.2.1 et l'analyseur utilisé pour l'indexation et la recherche est org.apache.lucene.analysis.core.WhitespaceAnalyzer. Le code ci-dessous est en Scala mais je pense qu'il est facile à lire pour tous ceux qui ont l'expérience d'un langage semblable à C.Indexer et rechercher des caractères non-alpha dans Lucene Java
Voici le problème: J'ai besoin d'indexer et de rechercher du texte avec des caractères non-alpha. Par exemple j'ai des entités avec des noms: "nom 1", "nom 2", "nom 3", ... et j'aimerais pouvoir chercher "nom 2" ou simplement "2" ou même "moi" 2 ".
Jusqu'à présent, j'ai
le terrain:
val textField = new TextField("text", theFullText, Field.Store.NO)
et la requête:
val parser = new QueryParser(version, "text", analyzer)
// case-sensitive search
parser.setLowercaseExpandedTerms(false) // removed when MyAnalyzer is used
// To be able to search for text in the middle. Makes searches slower when the index is big!
parser.setAllowLeadingWildcard(true)
val textWithWildcard = s"*${QueryParserBase.escape(text)}*"
val textQuery = parser.parse(textWithWildcard)
booleanQuery.add(textQuery, BooleanClause.Occur.MUST)
val topDocs: TopDocs = searcher.search(booleanQuery, 9999)
val hits: Array[ScoreDoc] = topDocs.scoreDocs
hits.map(_.doc) // return an Array of ScoreDocs' ids
Un simple test unitaire:
"be able to search numbers" {
for (idx <- 1 to 10) {
val entity = new Entity
entity.id = idx
entity.name = s"name ${idx}"
indexingService.index(entity)
}
val ids: Seq[Int] = indexingService.search[Entity]("name 3")
ids.length must_==(1)
}
-à-dire la création de 10 entités et alors chercher le th Troisième. Le problème est que le résultat est 0.
Idées que changer dans ma configuration pour le faire fonctionner?
Mise à jour: J'ai créé mon propre analyseur pour être en mesure de soutenir la recherche insensible à la casse:
class MyAnalyzer(ver: Version) extends Analyzer {
protected def createComponents(fieldName: String, reader: Reader): Analyzer.TokenStreamComponents = {
val tokenizer = new WhitespaceTokenizer(ver, reader)
val lowerCaseFilter = new LowerCaseFilter(ver, tokenizer)
val tsc = new Analyzer.TokenStreamComponents(tokenizer, lowerCaseFilter)
tsc
}
}
Et maintenant, le résultat est ! Encore une fois, ceci n'est pas souhaité parce que le test recherche "nom 3" mais toutes les entités sont renvoyées, c'est-à-dire qu'il semble que les nombres sont coupés à la fois à l'index et à la recherche.
Pouvez-vous sauvegarder 'booleanQuery' dans System.out? – mschonaker
Le voici: + (texte: * nom du texte: 3 *) –