Lucene-无法查询大写字母的值

Lucene-无法查询大写字母的值,lucene,case,Lucene,Case,我想索引和搜索小写的关键字。我附上了测试代码,它清楚地说明了我的简单目标。我索引了两个单词,一个用大写字母,然后我搜索并一个接一个地打印出来。为此,我创建了Analyzer,它只将关键字转换为小写(KeywordAnalyzer不使用小写,并且SimpleAnalyzer对非字母字符进行拆分)。我将此分析器用于IndexWriter和QueryParser。然而,由于某些原因,即使我搜索小写的单词(示例中的“bye”),也无法返回大写的单词 程序预期输出: hello Bye 实际产量: he

我想索引和搜索小写的关键字。我附上了测试代码,它清楚地说明了我的简单目标。我索引了两个单词,一个用大写字母,然后我搜索并一个接一个地打印出来。为此,我创建了
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
    }
}
import org.apache.lucene.store.FSDirectory
导入java.io.{Reader,File}
导入org.apache.lucene.index_
导入org.apache.lucene.document_
导入org.apache.lucene.search.indexsearch
导入org.apache.lucene.queryparser.classic.queryparser
导入org.apache.lucene.analysis.util.CharTokenizer
导入org.apache.lucene.analysis.Analyzer
导入org.apache.lucene.util.Version
导入org.apache.lucene.analysis.Analyzer.TokenStreamComponents
最终类LcAnalyzer(lucVer:Version)扩展了Analyzer{
def createComponents(字段名:字符串,读卡器:读卡器)=
新的TokenStreamComponents(新的CharTokenizer(lucVer,reader){
def isTokenChar(c:Int)=真
覆盖def normalize(c:Int)=字符.toLowerCase(c)
})
}
目标光遗传学测试{
val LV=Version.LUCENE_43
val F=“myf”
val val=Seq(“你好”,“再见”)
val indexDir=FSDirectory.open(新文件(“testindex”))
val anlz=新的LcAnalyzer(LV)
def main(参数:数组[字符串]){
写入数据()
val reader=DirectoryReader.open(indexDir)
val searcher=新索引搜索器(读卡器)
val p=新的QueryParser(LV、F、anlz)

对于(v)为什么不将
LcAnalyzer.createComponents
中的
KeywordTokenizer
LowercaseFilter
串在一起(参见中的示例)?我猜您的问题在
LcAnalyzer
的定义中,虽然我对Scala不是很熟悉,所以无法准确指出您的问题。我没有发现任何明显的概念错误。我在一开始就说明了我不使用这些的原因。我的分析器的实现与问题无关。您声明您不使用KeywordAnalyzer,因为它不是小写的。如果您使用关键字标记器进行标记,然后应用小写过滤器,这就解决了该问题。我没有看到任何其他语句排除了这种方法,请澄清是否有未明确说明的内容。不,它不能解决问题。我以前使用过关键字分析器,并且sult是一样的。我实际上查看了上面提到的两个Lucene分析器的代码,并相应地实现了我的。我的分析器有什么问题?