2017-09-03 8 views
0

J'utilise ElasticSearch v5.3.2requête ElasticSearch retourne étrange Sorted (score basé) résultat

Je le mappage suivant:

{ 
    "mappings":{ 
     "info":{ 
     "_all":{ 
      "enabled": false 
     }, 
     "properties":{ 
      "info":{ 
       "properties":{ 
        "email":{ 
        "doc_values":"false", 
        "fields":{ 
         "ngram":{ 
          "analyzer":"custom_nGram_analyzer", 
          "type":"text" 
         } 
        }, 
        "type":"keyword" 
        } 
       } 
      } 
     } 
    } 
    }, 
    "settings":{ 
     "analysis":{ 
     "analyzer":{ 
      "custom_nGram_analyzer":{ 
       "filter":[ 
        "lowercase", 
        "asciifolding", 
        "custom_nGram_filter" 
       ], 
       "tokenizer":"whitespace", 
       "type":"custom" 
      } 
     }, 
     "filter":{ 
      "custom_nGram_filter":{ 
       "max_gram":16, 
       "min_gram":3, 
       "type":"ngram" 
      } 
     } 
     } 
    } 
} 

Je vois des résultats très étranges en termes de scores de document lorsque je exécutez la requête suivante:

GET /info_2017_08/info/_search 
{ 
    "query": { 
     "multi_match": { 
      "query": "hotmail", 
      "fields": [ 
       "info.email.ngram" 
      ] 
     } 
    } 
} 

Il apporte les résultats suivants:

"hits": { 
    "total": 3, 
    "max_score": 1.3834574, 
    "hits": [ 
     { 
     "_index": "info_2017_08", 
     "_type": "info", 
     "_id": "AV4uQnCjzNcTF2GMY730", 
     "_score": 1.3834574, 
     "_source": { 
      "info": { 
       "email": "[email protected]" 
      } 
     } 
    }, 
    { 
     "_index": "info_2017_08", 
     "_type": "info", 
     "_id": "AV4uQm93zNcTF2GMY73x", 
     "_score": 0.3967861, 
     "_source": { 
      "info": {    
       "email": "[email protected]" 
      } 
     } 
    }, 
    { 
     "_index": "info_2017_08", 
     "_type": "info", 
     "_id": "AV4uQmYbzNcTF2GMY73P", 
     "_score": 0.36409757, 
     "_source": { 
      "info": { 
       "email": "[email protected]" 
      } 
     } 
    } 
    ] 
} 

Faites maintenant attention aux scores. Comment se fait-il que le premier résultat ait un score plus élevé que le second si le premier est ... @ gmail.com et le second est ... @ hotmail.com, si j'ai cherché le terme "hotmail"?

Le second devrait correspondre à la requête avec ngrams "mail" et "hotmail", alors que le premier ne correspondra à la requête que par ngram "mail", alors quelle est la raison d'un tel résultat?

Merci d'avance.

Répondre

1

Elasticsearch calcule les scores d'un document sur chaque fragment indépendamment en utilisant les statistiques TF/IDF. À cause de cela, si vous avez deux tessons avec le contenu suivant:

  1. "info.email": "[email protected]"
  2. "info.email": « [email protected] com », « info.email »: « [email protected] »

Ensuite, pour votre seul document de requête spécifique de la première tesson aura un score plus élevé que tout autre document de la deuxième tesson.

Vous pouvez examiner le contenu de chaque tessons prochain appel à l'aide de l'API: GET index/_search?preference=_shards:0

+0

Oui, vous avez raison, je l'ai découvert aussi. Quand je fais la même requête avec le paramètre de requête 'search_type = dfs_query_then_fetch', j'obtiens' hotmail' plus haut que tout autre 'gmail'. Maintenant, je dois trouver la différence entre les types de recherche en ce qui concerne la performance des requêtes. Si vous avez une information à ce sujet, j'aimerais savoir. Merci. –

+2

Il aura un impact sur la performance car il nécessite un aller-retour supplémentaire entre les partitions -détails [ici] (https://elastic.co/blog/understanding-query-then-fetch-vs-dfs-query-then- chercher). Dans ce [ES-guide] (https://elastic.co/guide/en/elasticsearch/guide/current/relevance-is-broken.html) vous pouvez même trouver une phrase: * N'utilisez pas dfs_query_then_fetch en production. .. * Comme alternative, vous pouvez soit expérimenter avec [Routing] (https://elastic.co/guide/en/elasticsearch/reference/5.5/mapping-routing-field.html) pour vous assurer que tous vos documents pertinents vont au même fragment, ou utilisez un seul fragment. – Joanna