2014-08-27 1 views
1

Je voudrais implémenter une recherche de site intranet avec l'aide d'Elasticsearch mais je ne trouve pas la formule de requête qui répondra tous mes besoins.Comment construire une requête Elasticsearch qui prendra en compte la distance entre les mots et l'exactitude du mot

est ici les critères que je voudrais demander à ma recherche lors de la recherche 2+ mots:

  • le plus proche sont les mots du texte de contenu, le plus élevé sera le score
  • quand il trouver le mot exact, il devrait donner un score plus élevé que s'il doit remplacer les lettres dans le mot dans une recherche floue
  • si tous les mots sont présents dans le texte, il devrait avoir un score plus élevé que s'il en trouve un

Voici une démo de ma requête de recherche où vous pouvez jouer en ligne: https://www.found.no/play/gist/6df91cb4ed1f2b4b7328

Quand je ne recherche « péager », je reçois le résultat dans cet ordre:

  1. Est-ce votre péage quelque chose connecteur pantalon portant
  2. est votre connecteur sans pantalon portant
  3. Est-ce votre péager portant un pantalon
  4. est votre sans faire quelque chose collector pantalon portant
  5. Est-ce votre sans quelque chose collector pantalon portant

Mais pourquoi le match exact est dans la troisième endroit? Pourquoi pas en première position? Ce que je veux est ce résultat:

  1. Est-ce votre péager pantalon portant
  2. Est-ce votre sans quelque chose collectionneur pantalon portant
  3. Est-ce votre sans faire quelque chose collectionneur porter des pantalons
  4. Est-ce que votre connecteur de péage porte un pantalon
  5. Est-ce votre
  6. sans quelque chose connecteur pantalon portant

Répondre

2

Votre requête ne prend pas l'ordre des mots en compte. Pour ce faire, vous devez ajouter "type": "phrase" à votre requête. Cela revient à remplacer "match" par "match_phrase".

Vous obtenez alors un document unique, le n ° 1 souhaité.

Pour permettre entre-deux mots, vous ajoutez "slop": 2

Vous obtenez alors les trois premiers documents désirés, dans le bon ordre. Mais le paramètre "flou" semble n'avoir aucun effet en mode phrase.

Pour obtenir également les réponses « connecteurs », vous pouvez regrouper les deux requêtes dans une clause « devrait »:

query: 
    bool: 
     should: 
     - match_phrase: 
      description: 
       query: "toll collector" 
       slop: 2 
     - match: 
      description: 
       query: "toll collector" 
       fuzziness: 2 

Cela ajoute les réponses « connecteurs », mais leur score ne prend pas l'in- entre les mots en compte. Pour ce faire, vous auriez besoin d'une sorte de score de distance qui encapsule à la fois le manque de mot et le flou des mots. Il ne sait pas si cela est implémenté, mais s'il existe, cela va coûter cher en informatique pour les modifications de niveau 2 des deux côtés.

Questions connexes