Code Dice.com pour mettre en œuvre les idées discutées dans les conférences suivantes :
Cela étend mes travaux antérieurs sur la « recherche conceptuelle » qui peuvent être trouvés ici - https://github.com/DiceTechJobs/ConceptualSearch (y compris des diapositives et des liens vidéo). Dans cet exposé, je présente un certain nombre d'approches différentes pour rechercher des vecteurs à grande échelle à l'aide d'un index inversé. Cela met en œuvre des approches de recherche approximative du k-voisin le plus proche, notamment :
et décrit comment ces idées peuvent être mises en œuvre et interrogées efficacement dans un index inversé.
MISE À JOUR : Après avoir discuté avec Trey Grainger et Erik Hatcher de LucidWorks, ils ont recommandé d'utiliser la fréquence des termes à la place des charges utiles pour les solutions dans lesquelles j'intègre les pondérations des termes dans l'index et j'utilise une fonction spéciale de similarité prenant en compte la charge utile (qui ne serait pas non plus nécessaire). Les charges utiles entraînent une pénalité de performances significative. Le défi réside dans les poids négatifs, je suppose qu'il n'est pas possible d'encoder des fréquences de termes négatifs, mais cela peut être contourné en ayant différents jetons pour les jetons pondérés positifs et négatifs, et en effectuant des ajustements similaires au moment de la requête (où des augmentations négatives peuvent être appliqué dans Solr selon les besoins).
Documentation Lucene : Filtre de fréquence de termes délimités Lucene
Il y a également eu une mise à jour récente du noyau Lucene qui est applicable ici et qui sera bientôt disponible dans la recherche Elastic au moment de la rédaction : Block Max WAND. Cela produit une accélération significative pour les grandes requêtes booléennes OR pour lesquelles vous n'avez pas besoin de connaître le nombre exact de résultats, mais vous souciez simplement d'obtenir les N premiers résultats aussi rapidement que possible. Toutes les approches dont je discute ici génèrent des requêtes OR relativement volumineuses et cela est donc très pertinent. J'ai également lu que l'implémentation actuelle de minimum-should-match inclut également des optimisations similaires, et donc le même type de gain de performances peut déjà être obtenu en utilisant des paramètres mm appropriés, quelque chose que j'expérimentais déjà dans mon code.
Activer 2018 : « Vecteurs en recherche »
Haystack 2019 : « Recherche avec des vecteurs »
Simon Hughes (scientifique en chef des données, Dice.com)