1

使用されている 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」を検索しますが、すべてのエンティティが返されるため、これは望ましくありません。つまり、インデックスと検索の両方で番号がカットされているようです。

4

2 に答える 2

0

フィールド内で単語のグループをまとめて検索するには、単語を二重引用符で囲みます。

ワイルドカードをスキップできると思います (name と 3 の間には何もありません)。

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

編集: 返されたドキュメントのスコアが異なるため、10 個の結果を返すことは正しい動作です。エンティティで検索する場合、完全一致クエリと部分一致クエリを区別できる必要があります。

于 2013-04-15T14:00:30.967 に答える