2016-05-08 4 views
0

Ich habe folgende Suche/Städte Index, wo Element wird Name und Bündel anderer Eigenschaften haben. Ich fahre folgendes Aggregat Suche:Elasticsearch gibt doppeltes Ergebnis

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

Als Ergebnis bekomme ich 3 Eimer mit den Tasten "Anahiem", "ana" und "santa". Unten ist Ergebnis:

"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 
       } 
      } 
      ] 
     } 
     } 
    } 
] 

Frage ist, warum letzte Eimer Schlüssel „santa“ haben sogar tho ich für „ana“ zu suchen und warum gleiche Stadt „Santa Ana“ (mit id = 154) zeigt in 2 verschiedenen Eimern nach oben (Schlüssel "ana" und Schlüssel "santa")?

Antwort

1

Es ist vor allem, weil Ihr cityName Feld analysiert wird, und somit, wenn Santa Ana indiziert ist, die beiden Token santa und ana werden immer generiert und verwendet für bucketing.

Wenn Sie möchten, um zu verhindern, dass Sie Ihre cityName Feld wie folgt definieren müssen:

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

Als erstes müssen Sie Ihren Index wischen, erstellen Sie es mit der obigen Abbildung und dann Ihre Daten neu indizieren. Nur dann erhalten Sie Ihre Bucket-Namen als Anaheim und Santa Ana.

UPDATE

Wenn Sie cityName analysiert werden sollen nur in Ihrer Aggregation einen einzigen Eimer gibt es eine Möglichkeit, bekommen, sondern auch ein multi-field durch die Definition, wo ein Teil und den anderen analysiert wird, ist nicht, wie diese

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

Sie Also lassen cityName Sie auch cityName.raw haben aber nun analysiert werden, die nicht analysiert wird und dass Sie in Ihrer Aggregation wie folgt verwenden können:

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

Val ich eigentlich wollen für cityName analysiert werden, so "Sant Ana" würde zurückgegeben werden, wenn ich mit "San" oder "Ana ". Gibt es eine Möglichkeit, doppelte Einträge zu vermeiden? Im Grunde ist der einzige Grund, den ich aggregiere, Duplikate loszuwerden. –

+0

Ja, ich habe meine Antwort aktualisiert. – Val

+0

Aber würde es nicht bedeuten, dass, wenn ich nach "ana" suche, nicht "Santa ana" nicht zurückgegeben wird, da die Suche nach pefix für die ganze Zeichenfolge vorgeht? –

1

UPDATE

Die repeation ist ein Verhalten von top_hits Aggregation.

Überprüfen Sie, ob nettes Tutorial:

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

Wenn allein die top_hits Aggregation verwenden, wiederholt sie genau das, was in der Antwort bereits in den regulären Treffern ist.

Eigentlich analysieren hat nichts damit zu tun. Die folgende Erklärung ist nicht wahr.

In den Standardeinstellungen teilt Elasticsearch die Eingabe in so genannte Terme auf. Der Standard-Analysator wandelt Santa Ana als 2 Begriffe um wie [santa, ana]. Ende bei der Suche nach anaSanta Ana wird auch übereinstimmen. Sie hier, wie Elastichsearch Arbeit zu lesen: https://www.elastic.co/blog/found-elasticsearch-from-the-bottom-up

+0

Danke @alpert. Ich würde "ana" verstehen, die Suche auslöst, aber warum "Sankt" als Schlüssel in Eimer geht? Bedeutet es, dass wenn ein Term in diesem Array getroffen wird, beide in 2 Buckets aufgeteilt werden? –

+0

Eigentlich ist das das Verhalten der top_hits Aggregation. Es wiederholt Treffer, wenn es alleine verwendet wird. Überprüfen Sie dieses nette Tutorial: https://www.elastic.co/blog/top-hits-aggregation – alpert