2016-06-21 8 views
1

私はドキュメントのスコアを変更するカスタム関数で検索しようとしています。 私は病院内に格納さ特選マッピングを持っていると、すべての専門はそれに優先順位がありますよう 何か:エラスティックサーチカスタム機能スコア

hospital:{ 
    name: 'Fortis', 
    specialities: [ 
    { 
    name: 'Cardiology', 
    priority: 10 
    }, 
    { 
    name: 'Oncology', 
    priority: 15 
    } 
] 
} 

は、今私は、関数のスコアを持っている:

functions: [{ 
    filter: {terms: {'specialities.name' => params[:search_text]}}, 
    script_score: {script: "_score * doc['specialities.priority'].value"} 
         }, 

私はフィルタクエリを持っています検索テキストを任意の専門分野に一致させることができます。 私がOncologyを検索した場合と同じように、それが一致すると、その専門分野の優先順位をとり、最終スコアに追加するscript_scoreを指定しました。

しかし、それはそれが10とマッチドフィルタ1のスコアであり、エンドスコアが11ではない21(フィルタ一致のため腫瘍 + 1の優先順位)が遭遇する最初の専門の優先権を取っている

答えて

1

elasticsearchにというネストされたマッピングを使用して解決しました。 のLuceneが内部、デフォルトでオブジェクトのマッピングを格納する概念がありません、私はすべての専門の優先順位を保存するために探していますので、もし私がこのようなマッピングを持っている必要があります。

hospital: { 
    properties: { 
    specialities: { 
     type: nested, 
     properties: { 
     name: { 
      type: 'string' 
     }priority: { 
      type: 'long' 
     } 
     } 
    } 
    } 
} 

参考:その後https://www.elastic.co/guide/en/elasticsearch/reference/2.0/nested.html

、Iネストされたクエリで関数スコアを定義できました。クエリは次のようになります。

"query": { 
    "filtered": { 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "nested": { 
       "path": "specialities", 
       "query": { 
        "function_score": { 
        "score_mode": "sum", 
        "boost_mode": "sum", 
        "filter": { 
         "terms": { 
         "specialities.name.raw": ["Oncology"] 
         } 
        }, 
        "functions": [ 
         { 
         "field_value_factor": { 
          "field": "specialities.priority" 
         } 
         } 
        ] 
        } 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
関連する問題