2016-08-25 12 views
1

私はElasticsearchを使用して簡単な検索を実装しようとしています。Elasticsearch:用語が存在しない場合の正のブースト

私が抱えている問題の1つは、検索クエリに用語が暗示されていることが多いことです。たとえば、誰かが「lenovo thinkpad battery」を入力すると、バッテリーが必要だと考えてください。しかし、誰かが "lenovo thinkpad"だけを入力した場合、その用語はクエリには表示されませんが、ラップトップが必要です。

私の解決方法は次のとおりです。関連する用語を手作業でまとめます。たとえば、コンピュータ/ラップトップのカテゴリでは、「バッテリー」、「キーボード」、「電源コード」、「アダプタ」、「ケーブル」、「保護計画」などの用語を使用できます。検索クエリ、私はこれらの用語を含まないすべての結果を肯定的に高める。

これはElasticsearchで可能ですか?

EDIT:

例文書

{"_source": { "item_title": "lenovo thinkpad white/black" }, 
"_source": { "item_title": "lenovo thinkpad battery" } 
} 

マッピング

{ 
    "properties": { 
     "item_title": { 
      "type": "string" 
     } 
    } 
} 

クエリ

POST my_index/my_type/_search 
{ 
    "from": 0, 
    "size": 10, 
    "query": { 
     "match": { 
      "item_title": "lenovo thinkpad" 
     } 
    } 
} 

クエリ結果:

"hits": { 
    "total": 2, 
    "max_score": 0.2169777, 
    "hits": [ 
    { 
     "_index": "my_index", 
     "_type": "my_type", 
     "_id": "2", 
     "_score": 0.2169777, 
     "_source": { 
      "item_title": "lenovo thinkpad battery" 
     } 
    }, 
    { 
     "_index": "my_index", 
     "_type": "my_type", 
     "_id": "1", 
     "_score": 0.2169777, 
     "_source": { 
      "item_title": "lenovo thinkpad black/white" 
     } 
    } 
    ] 
} 

この2つの結果のスコアは同じであることに注意してください。しかし、「lenovo thinkpad」というクエリには、「バッテリー」のような手動で選択した特別な用語が含まれていないため、その用語が含まれていない文書を積極的に追加して、 "item_title": "lenovo thinkpad white/black"はクエリ結果のスコアが高いはずです。

+0

問題をより効果的に理解するための照会とマッピングの追加を検討してください。 – user3775217

+0

@ user3775217 done – oneloop

答えて

0

私はウィキペディアのインデックス

GET /_search 
{ 
    "query": { 
     "query_string": { 
     "query": "(Darmstadt)^10 (NOT School)^8", 
     "fields": [ 
      "title^3" 
     ], 
     "phrase_slop": 3, 
     "use_dis_max": true 
     } 
    } 
} 

で次のクエリを実行する場合、私は実行すると、私はまだ

(それは通常、最初の10で提供されます)、さらにダウンリストの結果にダルムシュタット学校を取得します追記の質問

GET /_search 
{ 
    "query": { 
     "query_string": { 
     "query": "(Darmstadt AND SCHOOL)^10 (NOT School)^8", 
     "fields": [ 
      "title^3" 
     ], 
     "phrase_slop": 3, 
     "use_dis_max": true 
     } 
    } 
} 

私はダムシュタット校をNOT句に入れても最初の結果を得ます。 なので、私はあなたに似たようなことをお勧めします。

+0

NOTキャンプに単語を追加したい場合、構文は何ですか? – oneloop

+0

質問: "(ダルムシュタット・アンド・スクール)^ 10(学校ではない)^ 8(何かではない)^ 8(何かではない)^ 8" – ketrox

+0

これの鍵は、 "use_dis_max"を理解することです。クエリの重要な部分は、a、b、cをブール値とし、a + b + cは、(a + b + c)がtrueの場合、 a + b = a + c = a + b> a = b = cとすることができます。 – ketrox

関連する問題