2017-03-03 7 views
1

私は弾性検索でいくつかの書類を持っています。私は結果を以下に示す順に表示され、スタックのようないくつかの値を検索:弾性検索のカスタムソート

  1. スタックオーバーフロー
  2. StackOverflowの
  3. スタック
  4. StackOver
  5. StackOverflowの

私は結果を次の順に表示したい:

  1. スタック
  2. StackOver
  3. StackOverflowの
  4. スタックオーバーフロー
  5. StackOverflowの

すなわち、強要の試合ではなく、どのスペースや特殊文字の結果の最初に来る必要があります。 TIA

答えて

1

すべては、照会している文字列を分析する方法によって異なります。同じ文字列フィールドに複数のアナライザーを適用することをお勧めします。ここで

"name": { 
    "type": "string", 
    "analyzer": "keyword_analyzer", 
    "fields": { 
     "name_ac": { 
      "type": "string", 
      "index_analyzer": "string_autocomplete_analyzer", 
      "search_analyzer": "keyword_analyzer" 
     } 
    } 
} 

は、keyword_analyzerとstring_autocomplete_analyzerがアナライザは、あなたのインデックスの設定で定義されています。以下は、オートコンプリート/提案者の機能が欲しいその上に「名前」フィールドのマッピングの例があります。以下は例です:

"keyword_analyzer": { 
    "type": "custom", 
    "filter": [ 
     "lowercase" 
    ], 
    "tokenizer": "keyword" 
} 

"string_autocomplete_analyzer": { 
    "type": "custom", 
    "filter": [ 
     "lowercase" 
     , 
     "autocomplete" 
    ], 
    "tokenizer": "whitespace" 
} 

ここでオートコンプリートが分析フィルタである:これを設定した後

"autocomplete": { 
    "type": "edgeNGram", 
    "min_gram": "1", 
    "max_gram": "10" 
} 

自動提案をElasticsearchで検索するとき、あなたはmultiMatchを利用することができる照会の代わりに、ここではマルチマッチの個々のフィールドにブーストを提供します。以下は、Javaでの例です:

QueryBuilders.multiMatchQuery(yourSearchString,"name^3","name_ac"); 

あなたのニーズに従って(3 ^)ブーストを変更する必要があるかもしれません。

これでもあなたの要件を満たしていない場合、最初の単語に基づいて文字列を分析し、そのフィールドをマルチマッチに含めるもう1つのアナライザーがあると見ることができます。これらの分析フィルタと

"first_word_name_analyzer": { 
    "type": "custom", 
    "filter": [ 
     "lowercase" 
     , 
     "whitespace_merge" 
     , 
     "edgengram" 
    ], 
    "tokenizer": "keyword" 
} 

::以下は、このような解析の例がある

"whitespace_merge": { 
    "pattern": "\s+", 
    "type": "pattern_replace", 
    "replacement": " " 
}, 
"edgengram": { 
    "type": "edgeNGram", 
    "min_gram": "1", 
    "max_gram": "32" 
} 

あなたがに基づいて、最も最適な結果に到達するためにブースト値にいくつかの臨床試験を行う必要があり、あなたの要件。お役に立てれば。