2015-06-15 5 views
7

Von unten Beispiel elasticsearch Daten, die ich anwenden möchte wildcard sagen *.000ANT.* auf _id, um alle Dokumente abzurufen, deren _id000ANT enthält. Bitte helfen Sie.Wie funktioniert eine Platzhalter- oder Regex-Übereinstimmung für _id in elasticsearch?

"hits": [ 
    { 
    "_index": "data_collector", 
    "_type": "agents", 
    "_id": "Org000LAN_example1.com", 
    "_score": 1, 
    "fields": { 
     "host": [ 
     "example1.com" 
     ] 
    } 
    }, 
    { 
    "_index": "data_collector", 
    "_type": "agents", 
    "_id": "000BAN_example2.com", 
    "_score": 1, 
    "fields": { 
     "host": [ 
     "example2.com" 
     ] 
    } 
    }, 
    { 
    "_index": "data_collector", 
    "_type": "agents", 
    "_id": "000ANT_example3.com", 
    "_score": 1, 
    "fields": { 
     "host": [ 
     "example3.com" 
     ] 
    } 
    } 
] 
+0

Könnten Sie bitte erklären, was Sie mit Wildcard meinen? Ein Platzhalter ist normalerweise ein unbekanntes Zeichen oder eine Zeichenfolge. E, G .: do * g - Gibt Dokumente zurück mit: Dog, Doug, Doorlug. Die Suche nach der Zeichenfolge "000ANT" ist nur ein einfaches Spiel, könnten Sie bitte erläutern? –

+0

@ DanielHoffmann-Mitscherling: Ja, ich meine [Elasticsearch Regex oder Wildcard] (https://www.elastic.co/guide/en/elasticsearch/guide/current/_wildcard_and_regexp_queries.html) als "000ANT" kann vor und nachfixiert werden mit anderer Schnur – abi1964

+0

Ah! Sie möchten teilweise übereinstimmen. Ich werde eine ausführlichere Antwort posten. –

Antwort

3

Versuchen Sie, diese

{ 
    "filter": { 
     "bool": { 
     "must": [ 
      { 
       "regexp": { 
        "_uid": { 
        "value": ".*000ANT.*" 
        } 
       } 
      } 
     ] 
     } 
    } 
} 
+0

Das löst mein Problem, aber auch andere Lösungen sind willkommen. – abi1964

+0

Da meine Regex nie 'Agenten' haben kann, ist' _Typ' für mein Dokument und Ihre ist die erste Antwort. Ich akzeptiere deine Lösung. Danke :) Kommentare überprüfen [hier für weitere Details] (http://stackoverflow.com/a/30844555/707414) – abi1964

1

Ihre Zuordnung für die ID zulassen indiziert werden:

{ 
    "mappings": { 
    "agents": { 
     "_id": { 
     "index": "not_analyzed" 
     } 
    } 
    } 
} 

Und ein query_string danach suchen verwenden:

{ 
    "query": { 
    "query_string": { 
     "query": "_id:(*000ANT*)", 
     "lowercase_expanded_terms": false 
    } 
    } 
} 

Or so (mit Skripten und Abfragen nach wie vor nur die _id):

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "script": { 
      "script": "org.elasticsearch.index.mapper.Uid.splitUidIntoTypeAndId(new org.apache.lucene.util.BytesRef(doc['_uid'].value))[1].utf8ToString().contains('000ANT')" 
     } 
     } 
    } 
    } 
} 
+0

Ich kann meine Zuordnung jetzt nicht ändern. – abi1964

+0

Die Verwendung von '_uid' führt zu falschen Ergebnissen, wenn Sie nach Dingen suchen, die mit dem' type' Namen übereinstimmen.Wenn Sie beispielsweise nach "_uid" suchen: { "value": ". * Agents. *" } 'gibt alles zurück. –

+0

Können wir es mit Skript erreichen? So etwas wie "Skript": "(doc ['_ uid']. Value == '. * 0001MT_CAW18141225100. *')" ' – abi1964

3

Sie eine wildcard query wie diese verwenden können, obwohl es ist erwähnenswert, dass es nicht ratsam, eine Wildcard Begriff mit * zu beginnen, da die Leistung darunter leiden wird.

{ 
    "query": { 
    "wildcard": { 
     "_uid": "*000ANT*" 
    } 
    } 
} 

Beachten Sie auch, dass, wenn der Platzhalter Begriff, nach dem Sie suchen die Typnamen Ihrer Dokumente übereinstimmt, unter Verwendung uid wird nicht funktionieren, wie uid einfach die Kontraktion des Typs ist und die ID: type#id

+0

;-) auf der 'type' Sache ... –

+0

Was ist der Typ, auf den Sie sich beziehen? '" _type ":" agents "," type ist in meinem Fall immer 'agents'. – abi1964

+1

Ja, darauf beziehe ich mich. Wie in meiner Antwort und in Andrei's erwähnt, wenn die gesuchte ID den Begriff "Agenten" aus welchem ​​Grund auch immer enthält, funktioniert das Verwenden des '_uid' Feldes in der Abfrage nicht, da das alle Dokumente abgleichen wird. – Val

1

Sie haben hier zwei Möglichkeiten, die erste besteht in der Verwendung von Partial-Matching. Dies ist am einfachsten, wenn Sie eine Abfrage mit Platzhaltern umschlingen, die anderen Antworten ähnlich sind. Dies funktioniert bei nicht analysierten Feldern und unterscheidet zwischen Groß- und Kleinschreibung.

POST /my_index/my_type/_search 
{ 
"query": { 
    "wildcard": { 
     "_id": { 
      "value": "*000ANT*" 
     } 
    } 
} 
} 

Die zweite Option ist Elasticsearch Analysatoren und die richtige Zuordnung zu beschreiben, die Funktionalität, die Sie suchen zu verwenden, Sie über diese here lesen kann.

Die Grundvoraussetzung ist, dass Sie einen Analysator in Ihr Mapping einführen, der einen Tokenizer hat, der Strings in kleinere Token zerlegt, die dann angepasst werden können. Wenn Sie eine einfache Abfragesuche für "000ANT" im Feld "_id" ausführen, werden alle Ergebnisse mit dieser Zeichenfolge zurückgegeben.

Verwandte Themen