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
            }
         }
      }
   }
}
0
Yuseferi 29 août 2017 à 20:35

2 réponses

Meilleure réponse

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

0
Yuseferi 9 oct. 2017 à 08:19

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

1
cs25 29 août 2017 à 18:00