web-dev-qa-db-fra.com

elasticsearch augmente l'importance de la correspondance exacte de la phrase

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.

19
user2724314

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
    }
  }
}
26
javanna

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'.

7
James Addison

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

2
Bailey Smith

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"
      }
    }
  ]
}}}
1
csonuryilmaz

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.

0
bunny