2016-04-19 5 views
0

Newbie Frage zu elasticsearch. Ich habe den Elasticsearch lucene Index und die Verwendung der Suche nach Namen einrichten, die einige Begriffe enthalten, wieElasticsearch Übereinstimmungsabfrage mit partiellen Textübereinstimmung

search_response = es.search(index = 'sample', body = {'query':{'match':{'first_name':"JUST"}}}) 

Dies mir nicht zurückgeben den Namen „JUSTIN“, aber die folgende Abfrage funktioniert

search_response = es.search(index = 'sample', body = {'query':{'match':{'first_name':"JUSTIN"}}}) 

Was mache ich falsch? Sollte die Abfrage nicht übereinstimmen, geben Sie mir die Datensätze zurück, die den Begriff enthalten? Danke.

+0

Mögliche Duplikat [Elasticsearch: Teilzeichenfolge Spiel Finden] (http://stackoverflow.com/questions/23243867/elasticsearch-find-substring-match) – BlackPOP

+0

Nein, 'übereinstimmen query' werden Sie keine Aufzeichnungen erhalten, wenn Du suchst nach 'JUST'. Sie können versuchen mit JUST * in 'Wildcard-Abfrage' – Richa

Antwort

0

Der beste Weg, um diesen Bedarf zu bewältigen, ist die Erstellung eines benutzerdefinierten Analysators, der die edgeNGram token filter verwendet. Vergessen Sie Wildcards und verwenden Sie * in Abfragezeichenfolgen, die alle die RandNGram-Methode nicht erfüllen.

Sie müssten also Ihren Index zuerst erstellen und dann Ihre Daten neu indizieren. Dann

curl -XPUT http://localhost:9200/sample -d '{ 
    "settings": { 
     "analysis": { 
      "filter": { 
       "prefixes": { 
        "type": "edgeNGram", 
        "min_gram": 1, 
        "max_gram": 15 
       } 
      }, 
      "analyzer": { 
       "my_analyzer": { 
        "type": "custom", 
        "tokenizer": "standard", 
        "filter": ["lowercase", "prefixes"] 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "your_type": { 
      "properties": { 
       "first_name": { 
        "type": "string", 
        "analyzer": "my_analyzer", 
        "search_analyzer": "standard" 
       } 
      } 
     } 
    } 
}' 

wenn first_name: JUSTIN indizieren, werden Sie die folgenden indizierten Token erhalten: j, ju, jus, just, justi, justin, im Grunde alle Präfixe von JUSTIN.

Sie können dann mit Ihrer zweiten Abfrage suchen und tatsächlich finden, was Sie erwarten.

search_response = es.search(index = 'sample', body = {'query':{'match':{'first_name':'JUST'}}}) 
+0

Hat dies geholfen? Brauchen Sie mehr Informationen? – Val

Verwandte Themen