小文字のキーワードを索引付けして検索したいと考えています。IMHOが私の単純な目標を明確に示しているテストコードを添付しました。2 つの単語 (1 つは大文字) にインデックスを付けてから、それらを 1 つずつ検索して出力します。このために、Analyzer
キーワードを小文字に変換するだけのものを作成しました(小文字でKeywordAnalyzer
はなく、SimpleAnalyzer
文字以外の文字で分割されます)。このアナライザーを と の両方に使用しIndexWriter
ますQueryParser
。しかし、小文字の単語(例では「bye」)を検索しても、なぜか大文字の単語が返ってきません。
プログラムの期待される出力:
hello
Bye
実際の出力:
hello
どうしたの?
コードが Scala であることを気にしないでください。コードの機能が明確でない場合は、喜んでお手伝いします。
import org.apache.lucene.store.FSDirectory
import java.io.{Reader, File}
import org.apache.lucene.index._
import org.apache.lucene.document._
import org.apache.lucene.search.IndexSearcher
import org.apache.lucene.queryparser.classic.QueryParser
import org.apache.lucene.analysis.util.CharTokenizer
import org.apache.lucene.analysis.Analyzer
import org.apache.lucene.util.Version
import org.apache.lucene.analysis.Analyzer.TokenStreamComponents
final class LcAnalyzer(lucVer: Version) extends Analyzer {
def createComponents(fieldName: String, reader: Reader) =
new TokenStreamComponents(new CharTokenizer(lucVer, reader) {
def isTokenChar(c: Int) = true
override def normalize(c: Int) = Character.toLowerCase(c)
})
}
object LuceneTest {
val LV = Version.LUCENE_43
val F = "myf"
val VALS = Seq("hello", "Bye")
val indexDir = FSDirectory.open(new File("testindex"))
val anlz = new LcAnalyzer(LV)
def main(args: Array[String]) {
writeData()
val reader = DirectoryReader.open(indexDir)
val searcher = new IndexSearcher(reader)
val p = new QueryParser(LV, F, anlz)
for (v <- VALS) {
val hits = searcher.search(p.parse(F + ':' + v), 1).scoreDocs
for (i <- 0 until hits.length) {
val doc = searcher.doc(hits(i).doc)
println(doc.get(F))
}
}
}
def writeData() {
val writer = {
val wc = new IndexWriterConfig(LV, anlz)
val writer = new IndexWriter(indexDir, wc)
writer.commit
writer
}
for (v <- VALS) {
val doc = new Document
doc.add(new StringField(F, v, Field.Store.YES))
writer.addDocument(doc)
}
writer.commit
writer.close
}
}