2017-02-01 7 views
1

Hallo Leute, ich bin neu in der elastischen Suche, aber ich habe die grundlegende Dokumentation von ElasticSearch 5.1 durchgelesen.Elasticsearch Suchabfrage mit mehreren Filtern

Problem in einer Zeile:

Suche ist erfolgreich, aber Filter funktionieren nicht richtig.

Mapping-Datentypen

{ 
    "properties": { 
     "title": {"type": "string"}, 
     "description": {"type": "string"}, 
     "slug": {"type": "string"}, 
     "course_type": {"type": "string", "index" : "not_analyzed"}, 
     "price": {"type": "string"}, 
     "categories": {"type": "keyword", "index" : "not_analyzed"}, 
     "tags": {"type" : "keyword"}, 
     // "tags": {"type" : "keyword", "index" : "not_analyzed"}, 
     "status": {"type" : "string","index" : "not_analyzed"}, 
    } 
} 

Wie @Darth_Vader bemerkt habe ich versucht, auch Mapping. Es folgt mein Mapping

Dokument in Index (Erf-1)

.... 
{ 
    "_index": "learnings", 
    "_type": "materials", 
    "_id": "582d9xxxxxxxx9b27fab2c", 
    "_score": 1, 
    "_source": { 
     "title": "Mobile Marketing", 
     "slug": "mobile-marketing", 
     "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla eleifend hendrerit vehicula.", 
     "categories": [ 
     "Digital Marketing" 
     ], 
     "tags": [ 
     "digital-marketing", 
     "mobile-marketing" 
     ], 
     "status": "published" 
    } 
}, 
... 

Wie oben Ich habe wie hundert Dokumente in einem Index

SUCHE QUERY FULL, die ich bin mit

"query": { 
    "bool": { 
     "must": { 
      "multi_match" : { 
       "query" : "mobile", 
       "fields" : [ "title^5", "tags^4", "categories^3" ], 
       "operator": "and" 
      } 
     }, 
     "filter": { 
      "bool" : { 
       "must" : [ 
        {"term" : {"status": "published"} } 
       ] 
      } 
     } 
    } 
} 
  • In der obigen Abfrage ist das wichtigste Suchkriterium/Filter {"term" : {"status": "published"} }. Jedes Suchergebnis muss die Anforderung erfüllen.

  • Jetzt von der Liste der Ergebnisse, möchte ich mehr filtern. Also sage ich nur documents die mobile-marketing als tag haben soll. Mein Dokument (Erf-1) hat diese tag (mobile-marketing)

Das Problem ist jetzt:

Wenn ich meine Suchabfrage ändern und fügen Sie meine erforderlich Filter wie folgt: Ich bekomme kein Suchergebnis (Hits = 0), obwohl mein Dokument (Req-1)hat 0 als tag

"filter": { 
    "bool" : { 
     "must" : [ 
      {"term" : {"status": "published"} }, 
      {"term" : {"tags": "mobile-marketing"} } 
     ] 
    } 
} 

ABER wenn ich den Filter {"tags": "mobile-marketing"}TO{"tags": "mobile"} ändern, erhalte ich das gewünschte Dokument (Erf-1) als Ergebnis.

ich wollen das gleiche Dokument mit diesen Filter bekommen: {"tags": "mobile-marketing"}. Also, wo mache ich falsch?

Welche Änderung benötigt meine Suchanfrage?

Dank

+0

[Für Leute mit ähnlichen Problemen] .Das obige Verfahren und der damit verbundene Code funktioniert, stellen Sie sicher, dass Sie richtige Indexnamen und Indextypen zum Zeitpunkt der Zuordnung und andere damit verbundene Operationen –

Antwort

1

Wie funktioniert Ihr Mapping Look für tags?

Scheint, dass Sie Ihre Zuordnung für tags Feld wie analysiert haben. Was * analysiert` ist, ist aus der books:

Analysieren Sie zuerst die Zeichenfolge und indizieren Sie sie dann. Mit anderen Worten, indizieren Sie dieses Feld als Volltext.

So analysiert sie es zunächst, wo der Wert wieMobile-Marketing aussieht. Daher wird es aufgrund des Bindestrichs in der Mitte getrennt zwischen Mobilgeräten und Marketing gespeichert und in Token umgewandelt. dh: es speichert mobile und marketing in zwei verschiedene Token. Während

wenn es not_analyzed:

Index dieses Feld, so ist es durchsuchbar, aber Index der Wert genau wie angegeben. Analysiere es nicht.

Also wird dies im Grunde den Wert speichern, wie es ist, ohne es zu analysieren, was in Ihrem Fall den Trick tun sollte. Vielleicht sollten Sie sich auch diese point ansehen.

Hoffe es hilft!

+0

Oh danke @Darth_vader, ich habe keine Zuordnung, Ich habe einfach einen Index erstellt und begonnen, das Dokument ohne Zuordnung zu füllen. Ich denke, ich muss das Mapping machen und es "type" machen: "string", "index": "not_analyzed". Lass mich überprüfen, ob es funktioniert. Danke –

+0

Yup sicher, lassen Sie mich wissen, ob es funktioniert @ SiddharthaChowdhury. – Kulasangar

+0

Hey @Darth_Vader, ich habe versucht, Mapping und fügte meine Mapping-Details in der Frage. Aber es hat nicht funktioniert. Es verhält sich genauso. –

Verwandte Themen