2017-11-26 2 views
0

Ich suche nach einer Möglichkeit, ES zu veranlassen, die Daten mit mehreren Analysatoren zu suchen. NGram Analyzer und ein oder mehrere Sprachanalysatoren.Elastische Suche: Mehrere Analysatoren mit denselben Daten ausführen

Eine mögliche Lösung besteht darin, mehrere Felder zu verwenden und explizit anzugeben, welcher Analysator für jedes Feld verwendet werden soll.

Zum Beispiel folgende Zuordnungen zu setzen:

"mappings": { 
    "my_entity": { 
     "properties": { 
     "my_field": { 
      "type": "text", 
      "fields": { 
      "ngram": { 
       "type": "string", 
       "analyzer": "ngram_analyzer" 
      }, 
      "spanish": { 
       "type": "string", 
       "analyzer": "spanish" 
      }, 
      "english": { 
       "type": "string", 
       "analyzer": "english" 
      } 
      } 
     } 
     } 
    } 
    } 

Das Problem dabei ist, dass ich ausdrücklich jeden Bereich und seine Analysatoren für eine Suchanfrage schreiben haben. Und es wird nicht erlauben, mit "_all" zu suchen und mehrere Analysatoren zu verwenden.

Gibt es eine Möglichkeit, die Abfrage "_all" auf mehrere Analysatoren zu stellen? Etwas wie "_all.nram", "_all.spanish" und ohne die Verwendung von copy_to die Daten zu duplizieren?

Ist es möglich, ngram analyzer mit einer spanischen (oder einer anderen Fremdsprache) zu kombinieren und einen einzigen benutzerdefinierten Analysator zu erstellen? Ich habe die folgenden Einstellungen getestet, aber diese hat nicht funktioniert:

PUT /ngrams_index 
    { 
     "settings": { 
      "number_of_shards": 1, 
      "analysis": { 
      "tokenizer": { 
       "ngram_tokenizer": { 
       "type": "nGram", 
       "min_gram": 3, 
       "max_gram": 3 
       } 
      }, 
      "filter": { 
       "ngram_filter": { 
        "type": "nGram", 
        "min_gram": 3, 
        "max_gram": 3 
       }, 

       "spanish_stop": { 
       "type":  "stop", 
       "stopwords": "_spanish_" 
       }, 
       "spanish_keywords": { 
       "type":  "keyword_marker", 
       "keywords": ["ejemplo"] 
       }, 
       "spanish_stemmer": { 
       "type":  "stemmer", 
       "language": "light_spanish" 
       } 


      }, 
      "analyzer": { 
       "ngram_analyzer": { 
       "type": "custom", 
       "tokenizer": "ngram_tokenizer", 
       "filter": [ 
        "lowercase", 
        "spanish_stop", 
        "spanish_keywords", 
        "spanish_stemmer" 
       ] 
       } 
      } 
      } 
     }, 
     "mappings": { 
      "my_entity": { 
      "_all": { 
        "enabled": true, 
        "analyzer": "ngram_analyzer" 
      }, 

      "properties": { 
       "my_field": { 
        "type": "text", 
        "fields": { 
          "analyzer1": { 
          "type": "string", 
          "analyzer": "ngram_analyzer" 
          }, 
          "analyzer2": { 
            "type": "string", 
           "analyzer": "spanish" 
          }, 
          "analyzer3": { 
            "type": "string", 
           "analyzer": "english" 
          } 
        } 
       } 
      } 
      } 
     } 
    } 



    GET /ngrams_index/_analyze 
    { 
     "field": "_all", 
     "text": "Hola, me llamo Juan." 
    } 

Rückgabe: nur ngram Ergebnisse, ohne Spanisch Analyse

wo

GET /ngrams_index/_analyze 
    { 
     "field": "my_field.analyzer2", 
     "text": "Hola, me llamo Juan." 
    } 

richtig die Suchkette analysiert.

Ist es möglich, einen benutzerdefinierten Analysator zu erstellen, der Spanisch und Ngram kombiniert?

Antwort

1

Es gibt eine Möglichkeit, eine benutzerdefinierte ngram + Sprache Analysator zu erstellen:

PUT /ngrams_index 
{ 
    "settings": { 
    "number_of_shards": 1, 
    "analysis": { 
     "filter": { 
     "ngram_filter": { 
      "type": "nGram", 
      "min_gram": 3, 
      "max_gram": 3 
     }, 
     "spanish_stop": { 
      "type": "stop", 
      "stopwords": "_spanish_" 
     }, 
     "spanish_keywords": { 
      "type": "keyword_marker", 
      "keywords": [ 
      "ejemplo" 
      ] 
     }, 
     "spanish_stemmer": { 
      "type": "stemmer", 
      "language": "light_spanish" 
     } 
     }, 
     "analyzer": { 
     "ngram_analyzer": { 
      "type": "custom", 
      "tokenizer": "standard", 
      "filter": [ 
      "lowercase", 
      "spanish_stop", 
      "spanish_keywords", 
      "spanish_stemmer", 
      "ngram_filter" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "my_entity": { 
     "_all": { 
     "enabled": true, 
     "analyzer": "ngram_analyzer" 
     }, 

     "properties": { 
     "my_field": { 
      "type": "text", 
      "analyzer": "ngram_analyzer" 
     } 
     } 
    } 
    } 
} 


GET /ngrams_index/_analyze 
{ 
    "field": "my_field", 
    "text": "Hola, me llamo Juan." 
}