2016-09-07 6 views
2

身体のテキストが弾性検索インデックスに格納された約15,000の傷ついたウェブサイトがあります。私はすべてのこれらのテキストに使用されているトップ100最も使用される3ワードフレーズを取得する必要があります。このようなすべての文書で最もよく使われている3つの単語フレーズを取得する

何か:

Hello there sir: 203 
Big bad pony: 92 
First come first: 56 
[...] 

私はこれに新たなんです。用語ベクトルを調べましたが、単一のドキュメントに適用されるようです。ですから、用語ベクトルとnグラム分析による集約の組み合わせとなると思います。しかし、私はこれを実装するためにどのように行くのか分かりません。任意のポインタが役立ちます。

私の現在のマッピングと設定:

{ 
    "mappings": { 
    "items": { 
     "properties": { 
     "body": { 
      "type": "string", 
      "term_vector": "with_positions_offsets_payloads", 
      "store" : true, 
      "analyzer" : "fulltext_analyzer" 
     } 
     } 
    } 
    }, 
    "settings" : { 
    "index" : { 
     "number_of_shards" : 1, 
     "number_of_replicas" : 0 
    }, 
    "analysis": { 
     "analyzer": { 
     "fulltext_analyzer": { 
      "type": "custom", 
      "tokenizer": "whitespace", 
      "filter": [ 
      "lowercase", 
      "type_as_payload" 
      ] 
     } 
     } 
    } 
    } 
} 

答えて

2

あなたは帯状疱疹と呼ばれて探しているもの。帯状疱疹は「単語nグラム」のようなものです。基本的にはhttps://www.elastic.co/blog/searching-with-shingles

を、あなたが必要とする:

ここを見てみましょう(例えば、「私たちは生きて、すべての」、「黄色の」、「黄色い潜水艦」は「に住んでいる」、「すべてが住んでいます」)

弾性ブログポストの設定はなくて:シングル・アナライザは、もっぱら3期帯状疱疹を生成すると、フィールド

"filter_shingle":{ 
    "type":"shingle", 
    "max_shingle_size":3, 
    "min_shingle_size":3, 
    "output_unigrams":"false" 
} 

ザ・、のように(問題のフィールドにシングル・アナライザを適用した後ブログ投稿)、のデータを再索引すると、bodyフィールドに単純なterms aggregationを返すクエリを発行して、上位100語の3語句を表示できるはずです。

{ 
    "size" : 0, 
    "query" : { 
    "match_all" : {} 
    }, 
    "aggs" : { 
    "three-word-phrases" : { 
     "terms" : { 
     "field" : "body", 
     "size" : 100 
     } 
    } 
    } 
} 
+0

これは完全に機能します。ありがとうピーター! – HyderA

+0

ただ1つの質問ですが、1つのフィールドで複数のフレーズサイズを使用するにはどうすればよいですか。 2語句、4語句など?各分析装置のインデックスを作成する必要がありますか? – HyderA

+0

並べ替え別々のアナライザを使って別々のフィールドを作成し、ボディの内容をすべてにコピーします。その後、それぞれの目的に合わせて建てられた屋根板の欄に面することができます。 –

関連する問題