使用されている Lucene (Java) のバージョンは 4.2.1 で、インデックス作成と検索に使用されているアナライザーは org.apache.lucene.analysis.core.WhitespaceAnalyzer です。以下のコードは Scala ですが、C のような言語の経験がある人なら誰でも読みやすいと思います。
問題は次のとおりです。アルファベット以外の文字を含むテキストにもインデックスを付けて検索する必要があります。たとえば、「name 1」、「name 2」、「name 3」などの名前のエンティティがあり、「name 2」または単に「2」、さらには「me 2」を検索できるようにしたいと考えています。 "。
これまでのところ、
フィールド:
val textField = new TextField("text", theFullText, Field.Store.NO)
そしてクエリ:
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
簡単な単体テスト:
"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)
}
つまり、10 個のエンティティを作成してから、3 番目のエンティティを検索します。問題は、結果が 0 であることです。
それを機能させるために私の構成で何を変更するかのアイデアはありますか?
更新:大文字と小文字を区別しない検索をサポートできるように、独自のアナライザーを作成しました。
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
}
}
そして今、結果は10です! テストは「name 3」を検索しますが、すべてのエンティティが返されるため、これは望ましくありません。つまり、インデックスと検索の両方で番号がカットされているようです。