Elasticsearch existe-t-il un moyen de renforcer l’importance de la phrase exacte figurant dans le document?
Par exemple, si je recherchais l'expression "développeur Web" et que les mots "développeur Web" apparaissaient ensemble, ils seraient multipliés par 5, par rapport à "Web" et "développeur", apparaissant séparément dans le document. Ainsi, tout document contenant "développeur Web" apparaîtra en premier dans les résultats.
Vous pouvez combiner différentes requêtes en utilisant une requête booléenne , et vous pouvez également leur attribuer un boost différent. Supposons que vous ayez une requête d'interrogation régulière pour les deux termes, quelle que soit leur position, puis une requête d'expression avec un boost supérieur.
Quelque chose comme ce qui suit:
{
"query": {
"bool": {
"should": [
{
"match": {
"field": "web developer"
}
},
{
"match_phrase": {
"field": "web developer",
"boost": 5
}
}
],
"minimum_number_should_match": 1
}
}
}
Au lieu de javanna , vous pouvez faire quelque chose de similaire avec les clauses must
et should
dans une requête bool
:
{
"query": {
"bool": {
"must": {
"match": {
"field": "web developer",
"operator": "and"
}
},
"should": {
"match_phrase": {
"field": "web developer"
}
}
}
}
}
Non testé, mais je pense que la clause must
fera correspondre les résultats contenant both 'web' et 'developer' et la clause should
donnera un score plus élevé aux phrases correspondant à 'développeur Web'.
Vous pouvez essayer d’utiliser rescore pour obtenir une correspondance exacte de vos résultats initiaux. De la docs:
Msgstr "" "Le re-scoring peut aider à améliorer la précision en réordonnant les documents les plus importants (par exemple 100 à 500) renvoyés par les phases requête et post_filter, en utilisant un algorithme secondaire (généralement plus coûteux), au lieu d'appliquer l'algorithme coûteux à tous les documents de l'index. "
http://www.elasticsearch.org/guide/fr/elasticsearch/reference/current/search-request-rescore.html
J'ai utilisé ci-dessous exemple de requête dans mon cas qui fonctionne. Il apporte des résultats exacts + flous, mais les résultats exacts sont amplifiés!
{ "query": {
"bool": {
"should": [
{
"match": {
"name": "pala"
}
},
{
"fuzzy": {
"name": "pala"
}
}
]
}}}
Je pense que son comportement par défaut déjà avec match requête "ou" opérateur. Il va d'abord filtrer l'expression "développeur Web" puis des termes comme "web" ou "développeur". Bien que vous puissiez augmenter votre requête en utilisant les réponses ci-dessus. Corrige moi si je me trompe.