2014-02-12 4 views
15

Separat kann ich Teilsuche arbeiten und ich kann alle Felder durchsuchen. Bei einer Suche, die alle Felder abbildet, kann die Teilübereinstimmung jedoch nicht verwendet werden.Erstellen Sie eine ElasticSearch-Abfrage, um alle Felder zu durchsuchen und Teilabgleich gleichzeitig zu verwenden

Das gibt meinen Namen, wenn ich eine Teilübereinstimmung verwenden:

GET /_search?pretty=true 
{ 
    "query": { 
     "match": { 
      "FullName": "andon" 
     } 
    } 
} 

Diese Suche über alle Felder läuft, aber nicht teilweise Übereinstimmung tun (0 Treffer):

GET /_search?pretty=true 
{ 
    "query": { 
     "match": { 
      "_all": "andon" 
     } 
    } 
} 

Was ich tun müssen Sie tun, um Teilübereinstimmung mit einer Suche auf allen Feldern zu kombinieren & Arten? Ich habe viele Felder und Typen, daher hoffe ich, sie nicht alle manuell angeben zu müssen.

Wenn es einen Unterschied macht, füge ich meine Daten aus einem River, der mit SQL verbindet.

EDIT: Ich habe jetzt das Feld _all in meinem Mapping. Es scheint keinen Unterschied zu machen.

PUT /contact/ 
{ 
    "settings" : { 
     "index" : { 
      "analysis" : { 
       "analyzer" : { 
        "my_ngram_analyzer" : { 
         "tokenizer" : "my_ngram_tokenizer" 
        } 
       }, 
       "tokenizer" : { 
        "my_ngram_tokenizer" : { 
         "type" : "nGram", 
         "min_gram" : "1", 
         "max_gram" : "10" 
        } 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "_default_": { 
      "_all" : {"enabled" : true}, 
      "properties" : { 
       "Description":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"}, 
       "OfficePhone":{"type":"string","store":"yes"}, 
       "Email":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"}, 
       "FullName":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"}, 
       "ReportsTo":{"type":"string","store":"yes"}, 
       "Department":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"}, 
       "Title":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"} 
      } 
     } 
    } 
} 
+0

Haben Sie ' "_all": { "aktiviert": true} 'in Ihrem Mapping? siehe http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-all-field.html –

+0

@maxivanov Ich tat es nicht, aber ich mache es jetzt. Bitte sehen Sie meine Bearbeitung – Brandon

+0

Können Sie es reproduzieren? Ich kann einfach nicht: https://gist.github.com/maximivanov/8958787 –

Antwort

23

_all-field Die Arbeiten des Textes für alle Felder machen, passieren sie durch den Analysator für _all (die standard sofern nicht überschrieben ist), dann die resultierenden Begriffe Index.

Es tut nicht nehmen Sie, was auch immer die Bedingungen von den Analysatoren für die anderen Felder gemacht werden und schiebe sie alle in das gleiche Feld.

Sie müssten also das Feld _all überschreiben, um Ihren benutzerdefinierten Analysator zu verwenden.

Aber! Ich glaube nicht, dass du das wirklich willst. Sie erhalten einen viel größeren Index. _all zu haben ist manchmal bequem, aber es ist normalerweise besser zu kontrollieren, welche Felder zur Suchzeit durchsucht werden.

Anstatt match auf _all zu tun, möchten Sie wahrscheinlich multi_match verwenden und Ihre Felder angeben. Sie können auch copy_to betrachten, wenn Sie auf 1.0 sind.

+0

Ich habe auf 1.0 aktualisiert. Das Merkmal copy_to ist genau das, wonach ich gesucht habe. Ich habe ein neues Feld erstellt, in dem ich den ngram-Analysator verwendet habe, und ich habe alle Felder kopiert, die ich haben wollte. – Brandon

1

Ich habe versucht, mit Wildcard-Zeichen suchen (% 2A) und konnte teilweise Suchanfragen tun

ex => q = kauen% 2A & size = 100

Verwandte Themen