1

使用的 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”但返回了所有实体,即似乎数字在索引和搜索时都被削减了。

4

2 回答 2

0

解决方案是添加:

parser.setDefaultOperator(Operator.AND)

我之前尝试过,但由于某种原因它没有用。我想其他一些设置有问题。

于 2013-04-15T16:15:50.887 回答
0

要在字段中一起搜索一组单词,请用双引号将单词括起来。

我相信您可以跳过通配符(名称和 3 之间没有任何内容)。

val textWithWildcard = s"\"${QueryParserBase.escape(text)}\""

编辑:给你 10 个结果是正确的行为,因为返回的文档有不同的分数。当您按实体搜索时,您需要能够区分完全匹配查询和部分匹配查询。

于 2013-04-15T14:00:30.967 回答