Nous avons un site Web sur lequel les utilisateurs peuvent publier du contenu sur le site Web et après vérification de modération Contenu qu'ils ont publié, Titre et Description sont le champ le plus important que le contenu, nous voulons empêcher les utilisateurs de publier des articles similaires Nous cherchons donc à implémenter une méthode pour trouver des articles similaires et indiquer la modération.Ces contenus sont très similaires à certains anciens articles et le modérateur les vérifie attentivement pour les duplications, je veux dire les avertir de la modération comme doublons suspects, nous indexons tout le contenu dans Elastic recherche et ma question sur la requête optimale que nous devons écrire. Cela fait partie du code que nous avons essayé mais
$nameDesc = $title->Title. ' ' . $item->Description;
$query = [
'_source' => ['name', 'description', 'price'],
'query' => [
'filtered' => [
'query' => [
'multi_match' => [
'fields' => ['title', 'description'],
'type' => 'cross_fields',
'query' => $nameDesc
]
],
'filter' => [
'not' => [
'ids' => ['values' => [$item->ID]]
]
],
],
]
];
$dupeCandidates = $this->indexService->buildSearch('articles', $query)->setLimit(4)->get();
Je suppose que c'est mieux au lieu de concaténer Titre et Description et de faire une correspondance multiple cross_fields, d'essayer deux requêtes de correspondance distinctes ou une meilleure solution.
En bref Nous recherchons une requête optimale pour détecter un contenu similaire élevé par titre et description dans Elasticsearch .
Mettre à jour
Selon l'une des réponses proposées, j'ai essayé l'extrait de code suivant mais il n'y a pas de résultat (j'ai essayé un titre qui existe exactement dans l'index)
GET /_search
{
"query":{
"bool":{
"must":{
"more_like_this":{
"fields":[ "title", "description" ],
"like": "EXAMPLE EXIST TILE",
"min_term_freq":1,
"max_query_terms":100,
"min_doc_freq":0
}
}
}
}
}
2 réponses
Selon Ref @ cs25, une bonne solution consiste à utiliser more_like_this
{
"min_score": 5,
"query":
{"filtered": {
"query": {
"bool": {
"must": {
"more_like_this": {
"fields": ["title","desc"],
"like": {
"doc": {
"title": item["title"],
"desc": item["desc"],
},
},
"min_term_freq": 1,
"max_query_terms": 100,
"min_doc_freq": 0
}
}
}
},
"filter": {
"not": {
"term": {
"id": item["id"]
}
}
}
}
}
}
Réf: https: // www. élastique.co/guide/en/elasticsearch/reference/5.5/query-dsl-mlt-query.html
Vous pouvez utiliser la requête MLT (plus comme ça) d'Elasticsearch. Cela fonctionne assez bien pour donner des résultats similaires. Consultez ce lien pour la mise en œuvre:
https://www.elastic.co/guide/en/elasticsearch/reference/5.5/query-dsl-mlt-query.html
De nouvelles questions
php
PHP est un langage de script largement utilisé, de haut niveau, dynamique, orienté objet et interprété, principalement conçu pour le développement Web côté serveur. Utilisé pour les questions sur le langage PHP.