2017-08-29 8 views
0
で同様のトピック(重複が指名)

我々は、ユーザーがWebサイトにコンテンツを投稿することができ、ウェブサイトを持っており、彼らは公表節度チェック内容の後、タイトル説明は、そのコンテンツの最も重要な分野です検索、我々はないようにしたいですユーザーは同様の投稿を公開するように私たちは同様の投稿とヒントを見つけるためのメソッドを実装するため、これらのコンテンツはいくつかの古い投稿と非常によく似ており、モデレータは重複を慎重に確認しています。 Elastic検索では、私たちが書かなければならない最適なクエリについての私の質問。 これは、我々がしようとしたコードの一部が、Elasticsearch

$nameDesc = $title->Title. ' ' . $item->Description; 

    $query = [ 
     '_source' => ['name', 'description', 'price'], 
     'query' => [ 
      'filtered' => [ 
       'query' => [ 
        'multi_match' => [ 
         'fields' => ['title', 'description'], 
         'type' => 'cross_fields', 
         'query' => $nameDesc 
        ] 
       ], 
       'filter' => [ 
        'not' => [ 
         'ids' => ['values' => [$item->ID]] 
        ] 
       ], 
      ], 
     ] 
    ]; 
    $dupeCandidates = $this->indexService->buildSearch('articles', $query)->setLimit(4)->get(); 

である私は2つの別々の一致クエリ、またはよりよい解決策を試してみてください、マルチマッチングをcross_fieldsではなく連結タイトル説明の方が良いでしょうと仮定してください。

簡潔に我々は、Elasticsearchのタイトルと説明で高い類似の内容を検出する最適なクエリを探しています。

更新

は答えの一つに記載の(私は正確にインデックス付きに存在するタイトルを試してみました)

GET /_search 
{ 
    "query":{ 
     "bool":{ 
     "must":{ 
      "more_like_this":{ 
       "fields":[ "title", "description" ], 
       "like": "EXAMPLE EXIST TILE", 
       "min_term_freq":1, 
       "max_query_terms":100, 
       "min_doc_freq":0 
      } 
     } 
     } 
    } 
} 

答えて

1

あなたが使用することができ、私は次のコードを試みたが、何の結果はありません提案されていますMLT(more-like-this)Elasticsearchのクエリ。それは、同様のベースの結果を与えるためにかなりうまく動作します。 実装のために、このリンクをチェックアウト:

https://www.elastic.co/guide/en/elasticsearch/reference/5.5/query-dsl-mlt-query.html

+0

は、あなたはそれがクエリの提供することができますか? – zhilevan

+0

私はそのリンクを見ました、それはうまく見えますが、私は解決策を探しています2つの分野では、タイトルと説明を持つタイトルと説明、 – zhilevan

1

matchmatch_phrase文をあなたが達成しようとしているものに応じて異なるのアナライザで複数回、あなたのフィールドにインデックスを付けることにより、相互に組み合わせて使用​​することができます。 1つの方法は、フィールド(タイトル、説明)をanalyzednot_analyzedとして索引付けすることです。

Elasticsearch 2.xの Elasticsearch < 5.xでは

、もし文字列としてあなたのインデックスフィールド、彼らdefault to being analyzedmulti-fieldを定義するときは、インデックスをnot_analyzedと指定する必要があります(これは何でもかまいません。rawnot_analyzedフィールドに使用される複数フィールドとして指定します)。 Elasticsearchの新しいリリースで

PUT my_index 
{ 
    "mappings": { 
    "my_type": { 
     "properties": { 
     "title": { 
      "type": "string", 
      "fields": { 
      "raw": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
      } 
     }, 
     "description": { 
      "type": "string", 
      "fields": { 
      "raw": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Elasticsearch 5.xの

field datatypeを定義するフィールドまたはマルチフィールドは、例えばtext (analyzed)keyword (not_analyzed)ために、分析されるべきか否かを決定するであろう。

PUT my_index 
{ 
    "mappings": { 
    "my_type": { 
     "properties": { 
     "description": { 
      "type": "text", 
      "fields": { 
      "raw": { 
       "type": "keyword" 
      } 
      } 
     }, 
     "title": { 
      "type": "text", 
      "fields": { 
      "raw": { 
       "type": "keyword" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

マッピングを定義した後、先に行くと、インデックス、いくつかの書類をすでに

POST _bulk 
{ "index" : { "_index" : "my_index", "_type" : "my_type", "_id" : "1" } } 
{ "title" : "Test Title 1", "description": "Test Description 1" } 
{ "index" : { "_index" : "my_index", "_type" : "my_type", "_id" : "2" } } 
{ "title" : "Test Title 2", "description": "Test Description 2" } 
{ "index" : { "_index" : "my_index", "_type" : "my_type", "_id" : "3" } } 
{ "title" : "Test Title 3", "description": "Test Description 3" } 

を持っていない場合は、アプリケーションがユーザーの入力に類似OR同じであるコンテンツを検索する必要がある場合、あなたがインデックス化しました文書が存在するかどうかを判断するためにアプリケーションが検索する必要があるフィールドごとに句を指定するクエリを使用して検索文書を構築することができます。別々text (analyzed)として索引フィールドからの結果で応答する必要があり、そしてTest Title 1又はTest Description 1値はkeyword (not_analyzed)として索引フィールドからの結果で応答しなければならないTestTitleDescription値を使用して、上記の例では

GET my_index/my_type/_search 
{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match_phrase": { 
      "title": "Test Title" 
      } 
     }, 
     { 
      "match_phrase": { 
      "description": "Test Title" 
      } 
     }, 
     { 
      "match": { 
      "title.raw": "Test Title" 
      } 
     }, 
     { 
      "match": { 
      "description.raw": "Test Title" 
      } 
     } 
     ] 
    } 
    } 
} 

、。これはElasticsearch 5.5でテストされました。 CS25は良い解決策がmore_like_thisを使用している言及@

+0

tnxのattetionと時間を過ごすために、我々は、必要なセクションにタイトルマッチングを入れ、shouldセクションにマッチする説明を入れようと考えていますか? – zhilevan

+0

私はこれを疲れました。 – zhilevan

+0

どのバージョンのElasticsearchを使用していますか?検索APIはバージョン2.x以降に変更されました。編集を参照してください。 – dcd018