使用的 Lucene (Java) 版本是 4.2.1,用于索引和搜索的分析器是 org.apache.lucene.analysis.core.WhitespaceAnalyzer。下面的代码是在 Scala 中编写的,但我认为对于具有类似 C 语言经验的任何人来说都很容易阅读。
这是问题所在:我还需要用非字母字符索引和搜索文本。例如,我有名称的实体:“名称 1”、“名称 2”、“名称 3”……我希望能够搜索“名称 2”或只是“2”甚至“我 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 个实体,然后搜索第三个。问题是结果是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!同样,这是不希望的,因为测试搜索“名称 3”但返回了所有实体,即似乎数字在索引和搜索时都被削减了。