2016-10-08 5 views
3

Ich möchte "Marketing in sozialen Netzwerken" in Dokumenten suchen. Alle zusammen. Aber ich bekomme weiterhin Ergebnisse mit getrennten Wörtern. Ich habe folgende DSL-Abfrage:Wie suche ich mit ElasticSearch die exakte Phrase im Stringfeld?

{ 
    "fields": ["title"], 
    "query": { 
     "bool": { 
      "should": [{ 
       "match": { 
        "title": "SEO" 
       } 
      }], 
      "must": [{ 
       "match": { 
        "content": { 
         "query": "Marketing in social networks", 
         "operator": "and" 
        } 
       } 
      }] 
     } 
    } 
} 

Ich habe keine Dokumente, die diesen Satz und Titel enthalten, aber ich auch Ergebnisse (Dokumente) mit den Worten des Satzes gesplittet Suche erhalten. Ich möchte eine strenge Suche. Wenn es kein Dokument gibt, das diesen Ausdruck enthält, rufen Sie kein Dokument ab oder rufen nur Dokumente mit diesem Titel ab. Warum Operator und funktioniert nicht?

+0

„und“ bedeutet mir Dokumente geben, die alle diese Wörter enthalten. Verwenden Sie die "match_phrase" -Abfrage wie in der Antwort unten erwähnt. Es wird Ihnen korrekte Ergebnisse geben. – jay

Antwort

6

Können Sie versuchen, wie unten mit Typ Phrase. Siehe here, es heißt

Abfrage zuerst analysiert die Abfragezeichenfolge, um eine Liste der Begriffe zu erstellen. Es sucht dann nach allen Bedingungen, sondern hält nur Dokumente, die alle der Suchbegriffe, in den gleichen Positionen relativ zueinander

{ 
    "fields": ["title"], 
    "query": { 
     "bool": { 
      "should": [{ 
       "match": { 
        "title": "SEO" 
       } 
      }], 
      "must": [{ 
       "match": { 
        "content": { 
         "query": "Marketing in social networks", 
         "type": "phrase" 
        } 
       } 
      }] 
     } 
    } 
} 

P. S enthalten: Ich habe es noch nicht ausprobiert haben.

+0

Ok, "type": "Phrase" scheint gut zu funktionieren. Später werde ich es gründlich testen. –

+0

@ XairoMartínez unterdessen können Sie die Antwort akzeptieren :-) –

+0

ja, es funktioniert gut! –

5

erste Antwort ist gut, aber für ES v5 "type":"phrase" verwendet, wird [WARN ][org.elasticsearch.deprecation.common.ParseField] Deprecated field [type] used, replaced by [match_phrase and match_phrase_prefix query] in den Header zurückgeben
So richtige Abfrage sollte match_phrase enthalten:

{ 
    "fields": ["title"], 
    "query": { 
     "bool": { 
      "should": [{ 
       "match": { 
        "title": "SEO" 
       } 
      }], 
      "must": [{ 
       "match_phrase": { 
        "content": { 
         "query": "Marketing in social networks" 
        } 
       } 
      }] 
     } 
    } 
} 
Verwandte Themen