Elasticsearch “genre” de l'API vs more_like_this requête
Elasticsearch a deux caractéristiques similaires à obtenir "similaires" documents:
Il est le "De plus, Comme Cette API". Il me donne des documents semblables à un donné un. Je ne peux pas l'utiliser dans des expressions plus complexes si.
Il y a aussi le "more_like_this"
de la requête pour l'utilisation de l'API de Recherche je peux l'utiliser dans bool ou renforcer des expressions, mais je ne peux pas donner un id d'un document. - Je fournir la "like_text"
paramètre.
J'ai des documents avec les balises et le contenu. Certains documents ont de bonnes balises et d'autres ne le seront pas. Je veux un "documents Similaires", qui va travailler tous les temps, mais de classer des documents avec des balises plus élevé que les documents avec le texte correspondant. Mon idée était:
{
"boosting" : {
"positive" : {
"more_like_this" : {
"fields" : ["tag"],
"id" : "23452",
"min_term_freq" : 1
}
},
"negative" : {
"more_like_this" : {
"fields" : ["tag"],
"id" : "23452",
}
},
"negative_boost" : 0.2
}
}
Évidemment, cela ne fonctionne pas car il n'y a pas de "id"
dans "more_like_this"
. Quelles sont les alternatives?
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, une petite introduction sur le plus, comme cette fonctionnalité et comment il fonctionne. L'idée est que vous avez un document particulier et vous souhaitez avoir quelques autres qui sont similaires.
Afin de parvenir à cela, nous avons besoin d'extraire une partie du contenu de l'actuel document et l'utiliser pour faire une requête pour obtenir les mêmes. Nous pouvons extraire le contenu de l'lucene les champs stockés (ou le elasticsearch _source champ, qui est effectivement un champ stocké dans lucene) et en quelque sorte ré-analyser ou utiliser les informations stockées dans le terme de vecteurs (si activé lors de l'indexation) pour obtenir une liste de termes que l'on peut utiliser à la requête, sans avoir à ré-analyser le texte. Je ne suis pas sûr de savoir si elasticsearch essaie cette dernière approche s'terme vecteurs sont disponibles.
La de plus comme cette requête vous permet de fournir un texte, quel que soit l'endroit où vous l'ai eu à partir. Ce texte sera utilisé pour interroger les champs que vous sélectionnez et récupérer des documents similaires. Le texte ne sera pas entièrement utilisé, mais de nouveau, et seulement un maximum de
max_query_terms
(25 par défaut) seront conservés, des conditions qui ont au moins la conditionmin_term_freq
(durée minimale de la fréquence, par défaut 2) et le document de fréquence entremin_doc_freq
etmax_doc_freq
. Il y a plusieurs paramètres qui peuvent influencer la requête générée.La de plus comme cette api va plus loin, en permettant de fournir l'id d'un document et, de nouveau, une liste de champs. Le contenu de ces champs seront extraites de ce document spécifique et utilisé pour faire plus comme cette requête sur les mêmes champs. Cela signifie que le plus comme cette requête ont la propriété de texte contenant le texte copié précédemment, et sera réalisée sur les mêmes champs. Comme vous pouvez le voir plus comme cette api exécute plus que cette requête sous le capot.
Disons plus comme cette requête vous donne plus de flexibilité, puisque vous pouvez les combiner avec d'autres requêtes, et vous pouvez obtenir le texte quelle que soit la source que vous aimez.
D'autre part, le plus comme cette api expose les fonctionnalités courantes de faire un peu plus de travail pour vous, mais avec quelques restrictions.
Dans votre cas, je combiner un couple de différents genre de requêtes, de sorte que vous pouvez faire usage de la puissante elasticsearch requête DSL, dynamiser les requêtes différemment et ainsi de suite. L'inconvénient est que vous devez fournir vous-même le texte, puisque vous ne pouvez pas fournir l'id du document pour extraire à partir de.
Il y a différentes façons d'obtenir ce que vous voulez. Je voudrais utiliser un bool requête de combiner les deux dans le même genre de requêtes dans une devrait clause et de leur donner un poids différent. Je voudrais aussi utiliser le de plus comme ce champ de requête au lieu de cela, puisque vous voulez interroger un seul champ à la fois.
De cette façon, au moins un doit clauses doivent correspondre, et un match sur les étiquettes est plus important qu'un match sur le contenu.
"id"
JSON nom est d'obtenir le texte intégral et le placer dans"like_text"
. Il n'y a aucun moyen d'éviter les aller-retour de l'intégralité du texte. Il est également impossible de la réduire. E. g. il n'y a pas moyen d'accéder au terme de vecteur d'un document et d'obtenir seulement le 25 "top", afin que je puisse les placer directement dans le"like_text"
et obtenir les mêmes résultats que j'obtiendrais avec le texte intégral. S'il vous plaît confirmer. Je pensais à l'écriture d'un plugin elasticsearch ce serait me donner le n premiers termes d'un document. Pensez-vous que ça allait marcher?C'est maintenant possible avec la nouvelle comme syntaxe:
Voir ici: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html
docs
mot-clé a été dépréciée en faveur delike
.