web-dev-qa-db-fra.com

Création d'une requête ElasticSearch pour rechercher dans tous les champs et utiliser la correspondance partielle en même temps

Séparément, ma recherche partielle fonctionne et je peux effectuer une recherche dans tous les champs. Mais je ne peux pas utiliser de correspondance partielle dans une recherche qui mappe tous les champs.

Cela renvoie mon nom lorsque j'utilise une correspondance partielle:

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

Cette recherche fonctionne sur tous les champs, mais ne fait pas de correspondance partielle (0 hits):

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

Que dois-je faire pour combiner une correspondance partielle avec une recherche sur tous les champs et types? J'ai beaucoup de champs et de types, j'espère donc ne pas avoir à les spécifier tous manuellement. 

Si cela fait une différence, j'insère mes données à partir d'une rivière qui se connecte à SQL.

EDIT: J'ai maintenant le champ _all dans ma cartographie. Cela ne semble faire aucune différence.

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"}
            }
        }
    }
}
16
Brandon

Le champ _all- fonctionne en prenant le texte de tous les champs, transmettez-les à l'analyseur pour _all (qui est standard sauf substitution), puis indexez les termes résultants.

Il n'utilise pas les termes que les analyseurs définissent pour les autres champs et les placent tous dans le même champ.

Ainsi, vous devrez remplacer le champ _all- pour utiliser votre analyseur personnalisé.

Mais! Je ne pense pas que vous voudriez vraiment faire ça. Vous obtiendrez un index beaucoup plus grand. Il est parfois pratique d'avoir _all, mais il est généralement préférable de contrôler quels champs sont recherchés au moment de la recherche.

Ainsi, au lieu de faire une match sur _all, vous voudrez probablement utiliser multi_match , en spécifiant vos champs. Vous pouvez également considérer copy_to si vous êtes sur 1.0.

24
Alex Brasetvik

J'ai essayé d'effectuer une recherche avec des caractères génériques (% 2A) et j'ai pu effectuer des recherches partielles.

ex =>? q = mâcher% 2A & taille = 100

1
Manish Hittalmani