2016-04-25 24 views
0

Ich habe Probleme beim Einrahmen einer Adresse Suchabfrage in ElasticSearch.Elasticsearch Multi-Feld-Abfrage

Die Adresse wird in IHM mit folgenden Struktur gespeichert:
Adresse { Straße, Stadt, zipcode }

Und Abfrage hier ist ein Beispiel:

GET /adr-address/_search 
{ 
    "query": { 
    "multi_match": { 
     "query":  "mainstreet, houston", 
     "type":  "most_fields", 
     "fields":  [ "street", "city", "zipcode"] 
    } 
    } 
} 

"hits": [ 
{ 
     "_source": { 
     "id": "S6v4xyO8UE5NRcWtmMATPQ==", 
     "street": "Houston 2nd Avenue", 
     "zipcode": "8032", 
     "city": "Houston" 
    } 
}, 
{ 
    "_source": { 
     "id": "aLgQFrO8zCT8m88lAnYZPQ==", 
     "street": "Houston 1st Avenue", 
     "zipcode": "8044", 
     "city": "Houston" 
    } 
}, 
{ 
    "_source": { 
     "id": "aLgQFrO8zCT8m88lAnYZPQ==", 
     "street": "mainstreet", 
     "zipcode": "8044", 
     "city": "Houston" 
    } 
}, 

Der Multi Spiel Query funktioniert die meiste Zeit gut, mit Ausnahme des Szenarios, in dem Street auch den Namen der Stadt enthält. Elasticsearch räumt diesen Ergebnissen eine höhere Priorität ein, was völlig verständlich ist, auch wenn es nicht akzeptabel ist. Hier

ist das _analyze Ergebnis:

GET /adr-address/_validate/query?explain 
{ 
    "query": { 
    "multi_match": { 
     "query":  "mainstreet, houston", 
     "type":  "most_fields", 
     "fields":  [ "street", "city", "zipcode" ] 
    } 
    } 
} 

{ 
    "valid": true, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "explanations": [ 
     { 
     "index": "adr-address", 
     "valid": true, 
     "explanation": "(zipcode:mainstreet zipcode:houston) (street:mainstreet street:houston) (city:mainstreet city:houston)" 
     } 
    ] 
} 

Es sollte beachtet werden, dass Google Maps api genaue Ergebnisse für die gleiche Abfrage gibt.

  1. Tokenizer sind: Leerzeichen, Komma, Zahlen usw.
  2. Eingang Begriff kann mehr Wort Straßennamen, Postleitzahl oder Stadt in beliebiger Reihenfolge
enthält

Annahmen/Bedingungen bis jetzt gemacht

Irgendwelche Vorschläge, wie ich die Suchwiederholungen verbessern könnte?

+0

Ich weiß nicht, aber haben Sie versucht, um die Reihenfolge zu ändern: [ "Stadt", "Postleitzahl", "Straße"]? –

+0

Ja, aber es hat nicht geholfen und auch die _analyze Erklärung zeigt, dass es alle Begriffe in beiden Feldern – shailendher

+0

sucht Ich denke, copy_to Option ist, was ich brauche. Kopieren Sie alle Werte in ein neues Feld und führen Sie die Suche dort aus. https://www.elastic.co/guide/en/elasticsearch/guide/current/field-centric.html Ich sollte wissen, ob das morgen funktioniert. – shailendher

Antwort

0

Verwenden Sie cross_fields anstelle von most_fields als Typ für multi_match.

Aus der Dokumentation:

Der cross_fields Typ ist besonders nützlich bei strukturierten Dokumenten die mehrere Felder übereinstimmen sollten. Wenn Sie zum Beispiel die Felder first_name und last_name für "Will Smith" abfragen, ist die beste Übereinstimmung , die wahrscheinlich "Will" in einem Feld und "Smith" in dem anderen Feld haben.

Und die Most_fields, die Sie verwenden, scheint für die Suche durch den gleichen Text zu sein, aber auf verschiedene Arten analysiert.

Beispiel query:

GET /adr-address/_search 
{ 
    "query": { 
    "multi_match": { 
     "query":  "mainstreet, houston", 
     "type":  "cross_fields", 
     "fields":  [ "street", "city", "zipcode"] 
    } 
    } 
} 

link to docs

+0

Ja, genau das versuche ich jetzt und es sieht sehr vielversprechend aus. Ich werde dies als akzeptierte Antwort markieren, sobald ich morgen fertig bin. – shailendher

+0

funktioniert perfekt! Hier ist meine letzte Abfrage: 'GET/adr-Adresse/_validate/Abfrage?erklären { "Abfrage": { "multi_match": { "Abfrage": "Haupts, houston", "type": "cross_fields", "minimum_should_match": 2, "Felder": [ „Straße "," Stadt "," Postleitzahl "," Status "] } } }' – shailendher

Verwandte Themen