2017-06-01 3 views
0

Merci beaucoup @Random, j'ai modifié le mapping comme suit. Pour tester, j'ai utilisé "movie" comme type pour l'indexation. Note: J'ai ajouté search_analyzer aussi. Je n'obtenais pas de bons résultats sans cela. Cependant, j'ai des doutes suivants pour l'utilisation de search_analyzer.ElasticSearch: Peut-on appliquer à la fois des analyseurs de n-gram et de langage lors de l'indexation?

1] Pouvons-nous utiliser search_analyzer personnalisé dans le cas d'analyseurs de langage?
2] Est-ce que j'obtiens tous les résultats en raison de l'analyseur de n-gramme que j'ai employé et pas en raison de l'analyseur anglais?

{ 
    "settings": { 
     "analysis": { 
      "analyzer": { 
       "english_ngram": { 
        "type": "custom", 
        "filter": [ 
         "english_possessive_stemmer", 
         "lowercase", 
         "english_stop", 
         "english_stemmer", 
         "ngram_filter" 
        ], 
        "tokenizer": "whitespace" 
       }, 
       "search_analyzer":{ 
        "type": "custom", 
        "tokenizer": "whitespace", 
        "filter": "lowercase" 
       } 
      }, 
      "filter": { 
       "english_stop": { 
        "type": "stop" 
       }, 
       "english_stemmer": { 
        "type": "stemmer", 
        "language": "english" 
       }, 
       "english_possessive_stemmer": { 
        "type": "stemmer", 
        "language": "possessive_english" 
       }, 
       "ngram_filter": { 
        "type": "ngram", 
        "min_gram": 1, 
        "max_gram": 25 
       } 
      } 
     } 
    }, 
     "mappings": { 
    "movie": { 
     "properties": { 
     "title": { 
      "type": "string", 
      "fields": { 
      "en": { 
       "type":  "string", 
       "analyzer": "english_ngram", 
       "search_analyzer": "search_analyzer" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Mise à jour:

analyseur de recherche L'utilisation ne fonctionne pas aussi consistently.and besoin d'une aide à la question this.Updating avec mes conclusions.

J'ai utilisé la cartographie suivante comme suggéré (Note: Cette cartographie n'utilise pas l'analyseur de recherche), pour la simplicité, nous ne considérons que l'analyseur anglais.

{ 
    "settings": { 
     "analysis": { 
      "analyzer": { 
       "english_ngram": { 
        "type": "custom", 
        "filter": [ 
         "english_possessive_stemmer", 
         "lowercase", 
         "english_stop", 
         "english_stemmer", 
         "ngram_filter" 
        ], 
        "tokenizer": "standard" 
       } 
      }, 
      "filter": { 
       "english_stop": { 
        "type": "stop" 
       }, 
       "english_stemmer": { 
        "type": "stemmer", 
        "language": "english" 
       }, 
       "english_possessive_stemmer": { 
        "type": "stemmer", 
        "language": "possessive_english" 
       }, 
       "ngram_filter": { 
        "type": "edge_ngram", 
        "min_gram": 1, 
        "max_gram": 25 
       } 
      } 
     } 
    } 
} 

Créé index:

PUT http://localhost:9200/movies/movie/1

{"title":"[email protected] movie"} 

Essayé requête suivante:

GET http://localhost:9200/movies/movie/_search 

    { 
     "query": { 
      "multi_match": { 
       "query": "$peci mov", 
       "fields": ["title"], 
       "operator": "and" 
      } 
      } 
     } 
    } 

J'ai obtenu aucun résultat pour cela, que je fais quelque chose de mal? Je suis en train d'obtenir des résultats pour:

1] Special characters 
2] Partial matches 
3] Space separated partial and full words 

Merci encore!

Répondre

0

Vous pouvez créer un analyseur personnalisé basé sur les analyseurs de langage. La seule différence est que vous ajoutez votre filtre jeton ngram_filter à la fin de la chaîne. Dans ce cas, vous obtenez d'abord des jetons linguistiques (chaîne par défaut) convertis en ngrammes de bord à la fin (votre filtre). Vous pouvez trouver la mise en œuvre des analyseurs de langage ici https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html#english-analyzer afin de les contourner. Voici un exemple de ce changement pour la langue anglaise:

{ 
    "settings": { 
     "analysis": { 
      "analyzer": { 
       "english_ngram": { 
        "type": "custom", 
        "filter": [ 
         "english_possessive_stemmer", 
         "lowercase", 
         "english_stop", 
         "english_stemmer", 
         "ngram_filter" 
        ], 
        "tokenizer": "standard" 
       } 
      }, 
      "filter": { 
       "english_stop": { 
        "type": "stop" 
       }, 
       "english_stemmer": { 
        "type": "stemmer", 
        "language": "english" 
       }, 
       "english_possessive_stemmer": { 
        "type": "stemmer", 
        "language": "possessive_english" 
       }, 
       "ngram_filter": { 
        "type": "edge_ngram", 
        "min_gram": 1, 
        "max_gram": 25 
       } 
      } 
     } 
    } 
} 

MISE À JOUR

Pour prendre en charge des caractères spéciaux que vous pouvez essayer d'utiliser whitespace tokenizer au lieu de standard. Dans ce cas, ces personnages feront partie de vos jetons:

{ 
    "settings": { 
     "analysis": { 
      "analyzer": { 
       "english_ngram": { 
        "type": "custom", 
        "filter": [ 
         "english_possessive_stemmer", 
         "lowercase", 
         "english_stop", 
         "english_stemmer", 
         "ngram_filter" 
        ], 
        "tokenizer": "whitespace" 
       } 
      }, 
      "filter": { 
       "english_stop": { 
        "type": "stop" 
       }, 
       "english_stemmer": { 
        "type": "stemmer", 
        "language": "english" 
       }, 
       "english_possessive_stemmer": { 
        "type": "stemmer", 
        "language": "possessive_english" 
       }, 
       "ngram_filter": { 
        "type": "edge_ngram", 
        "min_gram": 1, 
        "max_gram": 25 
       } 
      } 
     } 
    } 
} 
+0

Merci beaucoup au hasard, votre réponse est vraiment utile, mais j'ai quelques doutes pour cela, je l'ai revu à nouveau ma question, pouvez-vous s'il vous plaît aider? – SSG

+0

Pourriez-vous s'il vous plaît fournir un exemple où votre 'search_analyzer' agit mieux que l'original? BTW, vous feriez mieux de garder la réponse originale aussi bien et juste ajouter une section "Mise à jour" avec des amendements ou même poser une question distincte, car sinon cela ajoute une certaine confusion – Random

+0

Salut Random! excuses pour la réponse tardive, mais il semble que l'utilisation de search_analyzer ne fonctionne pas toujours, j'ai mis à jour ma question dans la section Mise à jour. Ce serait une aide précieuse si vous pouviez jeter un oeil. – SSG