2017-02-27 4 views
0

4349P 43という2つの文書があります。検索用語に区切り文字が含まれている場合に検索結果をランク付けする一般的な方法は何ですか

マイインデックスDEFが

@AnalyzerDefs({ 
    @AnalyzerDef(
     name = "ngram", 
     charFilters = { 
      @CharFilterDef(factory = HTMLStripCharFilterFactory.class) 
     }, 
     tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class), 
     filters = { 
      @TokenFilterDef(factory = StandardFilterFactory.class), 
      @TokenFilterDef(factory = LowerCaseFilterFactory.class), 
      @TokenFilterDef(factory = StopFilterFactory.class, params = { 
       @Parameter(name = "words", value = "/org/apache/lucene/analysis/snowball/english_stop.txt")}), 
      @TokenFilterDef(factory = EdgeNGramFilterFactory.class, params = { 
       @Parameter(name = "maxGramSize", value = "1"), 
       @Parameter(name = "maxGramSize", value = "15") 
      }) 
     } 
    ), 

以下のように私の検索DEFはなく、同じです

  • 4349
  • P 43

ために、両方のP 43リターンの検索文字列ngramfilterと私は長さをオフにしました。

Q:第2位をより高いマッチとして返す方法、または返されたリストがうまくランク付けされていますか?

Q:入力クエリでトークン順をどのように取るか、すでに行われているかどうかを調べるもう1つの方法はありますか?

私はquerybuilder.phrase().withSlop(10)...sentence('P 43')を使用することができましたが、今ではもう、最初の結果を返すだけであなたのアナライザ定義は、あなたの条件を破る方法を理解する必要が秒1

+2

リトルノート:あなたは間違いかもしれない 'maxGramSize'を定義しましたか?私はhttps://hibernate.atlassian.net/browse/HSEARCH-2606を開き、そのフィードバックを改善しました。 – Sanne

答えて

0

does notの。 > [4434344349]

ながら -

  • 4349:は次のように一連のトークンに変換されます、あなたのようにEdgeNGramFilterFactoryを使用して

    "P 43"も同様に分割されますが、 "P"を "43"から分離した後にのみ、スタンドardTokenizerFactory

    • P 43 - > [p443]

    だから、これらのトークンがあなたの転置インデックスに挿入します。問合せ時に、文 "P 43" は、同じアプローチを使用して分割されます

    • P 43 - > [p443]

    どちらのドキュメントはすべて含まれていますクエリが要求しているように、443のしたがって、両方の文書が一致します。> [4349]

  • P 43 - - > [p43]
    • 4349:あなたがテストを繰り返したが、Nグラムベースのフィルタを無効にした場合

      今は別のインデックスを持つことになります

    あなたのクエリは次のようになります。

    • P 43 - > [p43]

    のみが第2の文書は、二つの用語p OR 43のいずれかと一致するので、唯一の第二の文書が一致考えます。

    私はトークンが各入力/アナライザの設定のために生産される予定されている確認するために自分自身を使用したものである、org.hibernate.search.util.AnalyzerUtilsヘルパークラスで遊んでお勧めします。

    Analyzer analyzer = searchFactory.getAnalyzer("ngram"); 
    System.out.println(AnalyzerUtils.tokenizedTermValues(analyzer, "description", "4349")); 
    System.out.println(AnalyzerUtils.tokenizedTermValues(analyzer, "description", "P 43")); 
    
関連する問題