2017-02-14 2 views
0

Ich bin 3.Wie Bindestrich-Zeichen in Python zu entkommen Elasticsearch

Ich habe eine Abfrage, um die grundlegende Elasticsearch Bibliothek in Python mit:

query = { 
     "query": { 
      "bool": { 
       "must": [{ "term": {"hostname": '"hal-pc"' } }] 
      } 
     } 
    } 

Das nenne ich mit: page = es.search(index = index_name, body=query, search_type='scan', scroll='2m')

Aber ich bekomme keine Ergebnisse. Ich kann andere Felder abfragen, so dass ich weiß, dass meine Abfrage funktioniert, aber wenn ich die Suche nach einem Feld mit einem Bindestrich im Wert hinzufüge, kann ich nichts finden. Wie kann ich diesem Charakter entkommen? Ich weiß, dass Sie mit normalen ES-Abfragen eine Nachricht senden können, um Ihr ES so zu konfigurieren, dass es auf bestimmte Arten auf bestimmte Zeichen reagiert, aber ich weiß nicht, wie ich das in Python machen soll.

+0

Wird das Feld 'hostname' in elasticsearch mapping analysiert? –

+0

Ich weiß nicht, was das bedeutet - ich pflege das ES nicht. Ich habe Zugang zu einem Kibana und es erscheint als ein Textfeld, wenn das hilft. –

Antwort

1

Wenn das Feld hostname im Mapping analysiert wird, speichert elasticsearch den Feldwert nicht so wie er ist. Stattdessen speichert es "hal-pc" als zwei separate Begriffe: "hal" und "pc" .So kann das Dokument nicht erhalten werden, wenn nach "hal-pc" mit dem Filter term gesucht wird.

Sie können nach "hal-pc" mit Match Abfrage suchen, um das erforderliche Ergebnis zu erhalten. Oder, indem Sie das Feld hostname Feld nicht analysiert und term Anfrage wie es ist.

Aber dies könnte auch Dokumente zurückgeben, wo Hostname nur "hal" oder einfach nur "pc" ist.

+0

Ich bin nicht genug vertraut mit ES, um Ihre Antwort zu verstehen. Können Sie als Beispiel eine Beispielabfrage "Übereinstimmung" angeben? Und wie würde ich das Feld nicht analysieren lassen? –

+0

Danke für die Bearbeitung. Wenn ich mehrere Hostnamen wie "hal-pc", "abc-pc", "foo-pc" habe, gibt mir das nur "hal-pc" oder? und ich kann dies mit anderen 'bool'-Abfragen kombinieren, indem ich' {"query": {"bool": {stuff}, "match": {stuff in deinem Post}}} oder? –

+0

Überprüfen Sie dies: https://www.elastic.co/guide/en/elasticsearch/guide/current/_finding_exact_values.html#_term_query_with_text –