2014-03-04 20 views
5

Da habe ich eine Abfrage wie folgt:Elasticsearch komplexe Nähe Abfrage

council* W/5 (tip OR tips)

Die obige Abfrage übersetzt werden kann als: etwas finden, dass Rat * und (Spitze oder Spitzen) hat keine mehr als 5 Wörter auseinander.

So folgenden Text entsprechen:

  • Shellharbour Stadt Rat Tipp
  • Rat beste Spitze
  • Räte Top 10 Tipps

Aber diese nicht übereinstimmen sollte:

  • ... Stadt Rat bei Shellharbour. Es gibt keine guten Tipp überhaupt.

Ich brauche Hilfe, um eine ElasticSearch-Abfrage dafür zu erstellen. Ich habe über Regex-Abfrage nachgedacht, aber ich bin mir nicht sicher über bessere Alternativen. Danke

Antwort

6

Sie können eine Kombination der span_near Abfrage, span_multi und span_or verwenden. Wir können die folgende Abfrage verwenden, um dieselbe Suche durchzuführen.

{ 
    "query": { 
    "span_near": { 
     "clauses": [ 
     { 
      "span_multi": 
      { 
      "match": 
      { 
       "prefix": { "text": "council"} 
      } 
      } 
     }, 
     { 
      "span_or": { 
      "clauses": [ 
       { 
       "span_term": { 
        "text": { 
        "value": "tip" 
        } 
       } 
       }, 
       { 
       "span_term": { 
        "text": { 
        "value": "tips" 
        } 
       } 
       } 
      ] 
      } 
     } 
     ], 
     "slop": 5, 
     "in_order": true 
    } 
    } 
} 

Die wichtigen Dinge, wo sie nach sind die span_term, die den Text für Ihre Suche ist. In diesem Beispiel hatte ich nur ein Feld namens "text". Slop gibt die Anzahl der Wörter an, die zwischen den Begriffen zulässig sind, und in_order gibt an, dass die Reihenfolge der Wörter wichtig ist. So wird "tip council" nicht passen, wo als "rate tip" wird.

+0

Danke, Kumpel, genau das suche ich. Meine Abfragen sind sehr kompliziert, ich muss etwas implementieren, um diese Abfragen mit dieser Suchanfrage span_ * elasticsearch zu übersetzen. –