2017-09-06 5 views
0

Je cherche une approche pour faire face à la pertinence de ElasticSearch pour les noms de documents comme « bouteille » et « capsules de bouteilles »documents relevance- ElasticSearch avec des noms similaires

Quand quelqu'un cherche une « bouteille » (terme de recherche), - "capsules de bouteilles" doivent être notées plus bas que "bouteilles rouges".

Actuellement, nos résultats des moteurs de recherche « bouteille de couleur rouge » pour être moins pertinentes que « bouchons de bouteille pour bouteille 500ml »

Répondre

1

Ce n'est pas quelque chose que vous pouvez résoudre en ElasticSearch, sans ajouter plus d'informations. Vous voulez classer les «bouteilles rouges» par rapport aux «capsules de bouteilles» parce que vous connaissez des informations sémantiques sur ces noms - vous savez que les «bouteilles rouges» signifient qu'il s'agit d'une «bouteille» et «capsules de bouteilles» il parle de quelque chose d'autre (lié aux bouteilles, mais pas réellement une bouteille). Si vous souhaitez que le classement d'Elasticsearch prenne en compte ces informations, vous devez indexer les informations (ajoutez éventuellement un champ de mot-clé, un avec «bouteille» et un avec «capsules de bouteilles» - vous devrez expérimenter pour voir ce qui fonctionne avec votre cas d'utilisation). Bien sûr, cela signifie qu'une personne a des tags de redirection pour tout. Cependant, je soupçonne que vous pouvez améliorer la situation avec unique filter. Je suppose que vous ne vous souciez pas beaucoup de la fréquence des termes dans un seul titre ("Bottle caps for 500ml bottle" n'est pas plus sur les bouteilles parce que "bottle" apparaît deux fois - la fréquence n'a pas de sens pour des titres comme ceci je pense). Ainsi, vous pouvez faire quelque chose comme ceci:

PUT /myindex 
{ 
    "settings": { 
    "index": { 
     "number_of_shards": 1 
    }, 
    "analysis": { 
     "analyzer": { 
     "uniq_analyzer": { 
      "type": "custom", 
      "tokenizer": "standard", 
      "filter": [ 
      "lowercase", 
      "porter_stem", 
      "unique" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "doc": { 
     "properties": { 
     "name": { 
      "type": "text", 
      "analyzer": "uniq_analyzer" 
     } 
     } 
    } 
    } 
} 

PUT /myindex/doc/1 
{"name": "Red coloured bottles"} 

PUT /myindex/doc/2 
{"name": "Bottle caps for 500ml bottle"} 

Alors si vous recherchez bottle, vous verrez les scores sont identiques - pas parfait, mais une amélioration. Dans le cas où vous voulez comprendre d'où un score vient, vous pouvez utiliser explain:

POST /myindex 
{ 
    "explain": true, 
    "query": { 
    "match": 
     {"name": "bottle"} 
    } 
} 
+0

Merci dshockley. J'ai dû vérifier si le marquage manuel du produit pouvait être évité. Je me demande si le document est étiqueté manuellement sur les grands marchés comme eBay où la fréquence à plus long terme ne signifie pas nécessairement une plus grande pertinence. Est-ce qu'ils laissent aux vendeurs de catégoriser correctement leurs produits? – vishnu

+0

Vous pouvez certainement essayer de marquer automatiquement, mais vous voudrez probablement commencer avec des données d'entraînement étiquetées. Vous pouvez également essayer une approche NLP (faire du tag POS, puis ajouter comme tags n'importe quel NNS classifié - cela aiderait dans votre exemple, mais je ne suis pas sûr que cela ferait mal ailleurs). Je ne sais pas si ebay/amazon marketplace/etc faire un étiquetage automatique ou simplement compter sur le vendeur. Si je devais le concevoir, je compterais probablement sur le vendeur, mais utiliserais une technique automatisée pour marquer des articles qui pourraient être mal classés pour l'examen. – dshockley