Elasticsearch: texte vs mot-clé. Les différences entre eux et comment… | par Brilian Firdaus | Moyen

Online Coding Courses for Kids

Maintenant que nous comprenons comment text et keyword se comportent une fois indexés, découvrons comment ils se comportent lorsqu’ils sont interrogés.

Tout d’abord, nous devons savoir qu’il existe deux types de requête pour la chaîne:

Pareil que Text et Keyword, la différence entre Match Query et Term Query est-ce que la requête dans Match Query sera d’abord analysée en termes, tandis que la requête dans Term Query Ne fera pas.

Interroger Elasticsearch fonctionne en faisant correspondre les termes interrogés avec les termes de l’index inversé, les termes interrogés et ceux de l’index inversé doivent être exactement les mêmes, sinon ils ne seront pas mis en correspondance. Cela signifie que la chaîne analysée et la chaîne non analysée dans les résultats d’indexation et d’interrogation produiront un résultat très différent.

Interroger le champ de mot-clé avec la requête de terme

Comme le type de données de champ et la requête ne sont pas analysés, ils devront tous deux être exactement les mêmes pour pouvoir produire un résultat.

Si nous essayons avec exactement la même requête:

curl --request POST 
--url 'http://localhost:9200/text-vs-keyword/_doc/_search?size=0'
--header 'content-type: application/json'
--data '{
"query": {
"term": {
"keyword_field": "The quick brown fox jumps over the lazy dog"
}
}
}'

Elasticsearch renverra un résultat:

{
"_index": "text-vs-keyword",
"_type": "_doc",
"_id": "example",
"_score": 0.2876821,
"_source": {
"keyword_field": "The quick brown fox jumps over the lazy dog",
"text_field": "The quick brown fox jumps over the lazy dog"
}
}
}

Si nous essayons avec quelque chose qui n’est pas exact, même s’il y a le mot dans l’index inversé:

curl --request POST 
--url 'http://localhost:9200/text-vs-keyword/_doc/_search?size=0'
--header 'content-type: application/json'
--data '{
"query": {
"term": {
"keyword_field": "The"
}
}
}'

Il n’a renvoyé aucun résultat car le terme de la requête ne correspond à aucun des termes de l’index inversé.

Interroger le champ de mot-clé avec la requête de correspondance

Essayons d’abord d’interroger la même chaîne “Le renard brun rapide saute par-dessus le chien paresseux” avec Match Query à keyword_mapping et voyez ce qui se passe:

curl --request POST 
--url http://localhost:9200/text-vs-keyword/_doc/_search
--header 'content-type: application/json'
--data '{
"query": {
"match": {
"keyword_field": "The quick brown fox jumps over the lazy dog"
}
}
}'

Le résultat devrait être:

{
"_index": "text-vs-keyword",
"_type": "_doc",
"_id": "example",
"_score": 0.2876821,
"_source": {
"keyword_field": "The quick brown fox jumps over the lazy dog",
"text_field": "The quick brown fox jumps over the lazy dog"
}
}

Attendez, cela ne devrait pas produire de résultat car les termes générés par la requête analysée ne correspondent pas exactement au “Le renard brun rapide saute par-dessus le chien paresseux” dans l’index inversé, mais pourquoi produit-il un résultat?

C’est vrai, la requête a été analysée, car nous utilisons Match Query, mais au lieu d’un analyseur standard, Elasticsearch a utilisé index-time analyseur, qui a été mappé sur le Keyword type de données de champ. Puisque l’analyseur mappé avec Keyword le type de données de champ est Term Analyzer, Elasticsearch n’a rien changé à la requête.

Maintenant, essayons avec un analyseur standard:

curl --request POST 
--url http://localhost:9200/text-vs-keyword/_doc/_search
--header 'content-type: application/json'
--data '{
"query": {
"match": {
"keyword_field": {
"query": "The quick brown fox jumps over the lazy dog",
"analyzer":"standard"
}
}
}
}'

Aucun résultat n’est produit car il analyse la requête en termes et rien ne correspond exactement au terme de l’index inversé.

Requête de type de texte avec une requête de terme

Le document indexé de type texte aura de nombreux termes comme nous pouvons le voir dans la section précédente. Pour montrer comment la requête est mise en correspondance avec les termes de l’index inversé, essayons deux requêtes. La première requête envoie la phrase entière à Elasticsearch;

curl --request POST 
--url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty='
--header 'content-type: application/json'
--data '{
"query": {
"term": {
"text_field": "The quick brown fox jumps over the lazy dog"
}
}
}'

le second seulement «Le».

curl --request POST 
--url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty='
--header 'content-type: application/json'
--data '{
"query": {
"term": {
"text_field": "The"
}
}
}'

Les deux requêtes ne produisent aucun résultat.

La première requête n’a produit aucun résultat car, dans l’index inversé, nous n’avons jamais stocké la phrase entière, le processus d’indexation ne stocke que les termes qui ont déjà été séparés du texte.

La deuxième requête n’a également produit aucun résultat. Il y a un “Le” dans le document indexé, mais rappelez-vous que l’analyseur a mis le mot en minuscules, donc dans l’index inversé, il est stocké comme “le”

Essayons à nouveau la requête de termes avec “le”:

curl --request POST 
--url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty='
--header 'content-type: application/json'
--data '{
"query": {
"term": {
"text_field": "the"
}
}
}'

Oui! il a produit un résultat car interrogé «le» est une correspondance exacte avec le «le» dans l’index inversé.

Interroger le type de texte avec une requête de correspondance

Il est maintenant temps de saisir du texte avec Match Query, puisqu’il analyse les deux types, il est facile de les amener à produire des résultats. Essayons d’abord avec deux requêtes

La première requête enverra “The” à Elasticsearch, nous savons qu’avec term query il ne produit aucun résultat, mais qu’en est-il match query?

La deuxième requête enverra «le chien LAZ a trébuché sur le chien brun QUICK», certains mots sont dans l’index inversé, d’autres non, est-ce que Elasticsearch en produira un résultat?

curl --request POST 
--url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty='
--header 'content-type: application/json'
--data '{
"query": {
"match": {
"text_field": "The"
}
}
}'
curl --request POST
--url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty='
--header 'content-type: application/json'
--data '{
"query": {
"match": {
"text_field": "the LAZ dog tripped over th QUICK brown dog"
}
}
}'

Oui! Les deux ont produit un résultat

{
"_index": "text-vs-keyword",
"_type": "_doc",
"_id": "example",
"_score": 0.39556286,
"_source": {
"keyword_field": "The quick brown fox jumps over the lazy dog",
"text_field": "The quick brown fox jumps over the lazy dog"
}
}

La première requête a produit un résultat car «Le» de la requête a été analysé et est devenu «le», qui correspond exactement à celui de l’index inversé.

La deuxième requête, bien que tous les termes ne soient pas dans l’index inversé, produit toujours un résultat. Elasticsearch retournera un résultat, même si un seul des termes interrogés correspond exactement à celui de l’index inversé.

Si vous faites attention au résultat, il y a un _score champ. Le nombre de termes de la requête qui correspondent exactement à celui de l’index inversé est l’un des facteurs qui affectent le score, mais gardons le calcul du score pour un autre jour.

Close Menu