2016-05-08 19 views
0

私は次のsearch/citiesインデックスを持っています。ここで要素は名前と他のプロパティの束を持っています。私は、キー「Anahiem」、「ANA」と「サンタ」で3つのバケツを得る結果Elasticsearchは重複した結果を返します

{ 
"size": 0, 
"query": { 
    "multi_match" : { 
     "query": "ana", 
     "fields": [ "cityName" ], 
     "type" : "phrase_prefix" 
    } 
}, 
"aggs": { 
    "res": { 
     "terms": { 
      "field": "cityName" 
     }, 
     "aggs":{ 
      "dedup_docs":{ 
       "top_hits":{ 
        "size":1 
       } 
      } 
     }    
    } 
} 
} 

:私は、次の集計検索を実行します。以下はその結果です:最後のバケットは、キー「サンタは」私は「ANA」を検索してもカントーとその理由(= 154 IDを持つ)同じ都市「サンタ・アナは」2つの異なるバケットに表示(た理由

"buckets": [ 
    { 
     "key": "anaheim", 
     "doc_count": 11, 
     "dedup_docs": { 
     "hits": { 
      "total": 11, 
      "max_score": 5.8941016, 
      "hits": [ 
      { 
       "_index": "search", 
       "_type": "City", 
       "_id": "310", 
       "_score": 5.8941016, 
       "_source": { 
       "id": 310, 
       "country": "USA", 
       "stateCode": "CA", 
       "stateName": "California", 
       "cityName": "Anaheim", 
       "postalCode": "92806", 
       "latitude": 33.822738, 
       "longitude": -117.881633 
       } 
      } 
      ] 
     } 
     } 
    }, 
    { 
     "key": "ana", 
     "doc_count": 4, 
     "dedup_docs": { 
     "hits": { 
      "total": 4, 
      "max_score": 2.933612, 
      "hits": [ 
      { 
       "_index": "search", 
       "_type": "City", 
       "_id": "154", 
       "_score": 2.933612, 
       "_source": { 
       "id": 154, 
       "country": "USA", 
       "stateCode": "CA", 
       "stateName": "California", 
       "cityName": "Santa Ana", 
       "postalCode": "92706", 
       "latitude": 33.767371, 
       "longitude": -117.868255 
       } 
      } 
      ] 
     } 
     } 
    }, 
    { 
     "key": "santa", 
     "doc_count": 4, 
     "dedup_docs": { 
     "hits": { 
      "total": 4, 
      "max_score": 2.933612, 
      "hits": [ 
      { 
       "_index": "search", 
       "_type": "City", 
       "_id": "154", 
       "_score": 2.933612, 
       "_source": { 
       "id": 154, 
       "country": "USA", 
       "stateCode": "CA", 
       "stateName": "California", 
       "cityName": "Santa Ana", 
       "postalCode": "92706", 
       "latitude": 33.767371, 
       "longitude": -117.868255 
       } 
      } 
      ] 
     } 
     } 
    } 
] 

質問ですキー "アナ"とキー "サンタ")?

答えて

1

: あなたはどのようにElastichsearch作業ここから約読み取ることができます。

あなたはこのようなあなたのcityNameフィールドを定義する必要があることを防止したい場合:

PUT search 
{ 
    "mappings": { 
     "City": { 
      "properties": { 
       "cityName": { 
        "type": "string", 
        "index": "not_analyzed" 
       } 
      } 
     } 
    } 
} 

あなたが最初にあなたのデータを再インデックスその後、上記のマッピングで再作成し、あなたのインデックスを拭く必要があります。それでは、バケツ名はAnaheimSanta Anaとなります。

UPDATE

あなたはcityNameが分析だけでなく、あなただけの集計で、単一のバケツを取得したい場合は、一部が分析されmulti-field、そして他のものを定義することによって、方法はありませんされていますこの

PUT search 
{ 
    "mappings": { 
     "City": { 
      "properties": { 
       "cityName": { 
        "type": "string", 
        "fields": { 
         "raw": { 
          "type": "string", 
          "index": "not_analyzed" 
         } 
        } 
       } 
      } 
     } 
    } 
} 

ようにあなたは、このようなあなたの集計に使用できるように、あなたはcityNameが分析させたが、今も分析されていないcityName.rawを持って:

"terms": { 
     "field": "cityName.raw" 
    }, 
+0

Val実際にはcityNameを分析したいので、 "San"または "Ana"で検索すると "Sant Ana"が返されます"重複したエントリを削除する方法はありますか?基本的に私が集める唯一の理由は重複を取り除くことです。 –

+0

はい、回答を更新しました。 – Val

+0

しかし、 "ana"を検索しても、検索はすべての文字列に対してpefixを行っているので、 "Santa ana"は返されません。 –

1

UPDATE

repeationはtop_hits凝集の挙動です。

確認することを素敵なチュートリアル:

https://www.elastic.co/blog/top-hits-aggregation

のみtop_hits集約を使用して、それだけですでに対応して定期的なヒットで が何であるかを繰り返します。

実際に分析することは、それとは関係ありません。したがって、以下の説明は真実ではありません。

デフォルト設定では、Elasticsearchは入力をいわゆる用語に分割します。デフォルトのアナライザはSanta Anaを[santa,ana]のように2項に変換します。終了時に検索するとanaSanta Anaも一致します。あなたのcityNameフィールドが分​​析され、そしてSanta Anaがインデックス化されたときにこのように、2つのトークンsantaanaを生成し、バケットのために慣れているので、それは主にです https://www.elastic.co/blog/found-elasticsearch-from-the-bottom-up

+0

ありがとうございます@alpert。私は 'アナ'が検索を誘発するのを理解するだろうが、なぜ 'サンタ'がバケツのキーとして行くのか?その配列の中のいずれかの用語が2つのバケットに分割される場合、そのことを意味しますか? –

+0

これは実際にtop_hits集約の動作です。単独で使用するとヒットが繰り返されます。素敵なチュートリアルをチェックしてください:https://www.elastic.co/blog/top-hits-aggregation – alpert

関連する問題