9
votes

Elasticsearch ne retourne pas des matchs singuliers / pluriels

J'utilise une bibliothèque PHP d'Elasticsearch pour indiquer et trouver des documents sur mon site Web. Ceci est le code de création de l'index: xxx

I. J'utilise Curl Xput pour ajouter des documents à l'index et xget pour interroger l'index. Cela fonctionne bien, à l'exception du fait que les singuliers et les pluriels de mots de requête ne sont pas appariés dans l'indice tout en retournant les résultats. Par exemple, lorsque je recherche des "discussions", les matchs de "discussion" ne sont pas retournés et inversement. Pourquoi cela est-il ainsi? Je pensais que cela est pris en charge par défaut à Elasticsearch. Y a-t-il quelque chose que nous devons mentionner explicitement pour qu'il correspondre aux formes singulières / plurielles?


0 commentaires

3 Réponses :


7
votes

L'analyseur ELASCTSECHSEARCH ne fait pas obstination et c'est ce dont vous avez besoin pour gérer pluriel / singulier. Vous pouvez essayer d'utiliser Analyseur de Snowball pour vos champs de texte à voir si elle Fonctionne mieux pour votre cas d'utilisation:

curl -XPUT 'http://localhost:9200/test' -d '{
    "settings" : {
        "index" : {
            "number_of_shards" : 1,
            "number_of_replicas" : 1
        }
    },
    "mappings" : {
        "page" : {
            "properties" : {
                "mytextfield": { "type": "string",  "analyzer": "snowball", "store": "yes"}
            }
        }
    }
}'


6 commentaires

J'ai essayé cela et je reçois une erreur: "Message: Échec de la charge de la classe [Type] avec la valeur [Boule de neige]". Devrais-je installer quelque chose de plus ici? Si oui, quoi et où?


Quelle version d'élasticsearch utilisez-vous? Je l'ai testé sur 0,17 et sur Master et cela fonctionne bien avec les paramètres par défaut. Avez-vous modifié la commande de quelque manière que ce soit?


J'utilise l'élasticsearch 0.14. Je n'ai pas modifié la commande - Je ne sais pas pourquoi obtiendra l'erreur. J'ai utilisé Porter Stet et ça a fonctionné pour moi. J'ai ajouté la configuration que j'ai utilisée dans la réponse ci-dessous. Merci pour ton aide!


Imotov, besoin de votre aide sur une chose - dans l'exemple que vous avez donné, vous avez défini les champs de la stemming (par exemple, myTextfield dans votre code). Comment puis-je donner que stemming devrait arriver sur tous les domaines? J'apprécierai vraiment votre aide


Vous pouvez créer un analyseur appelé "Par défaut" de la même manière que vous avez créé "STEM" et cet analyseur sera appliqué à tous les champs par défaut. Ou vous pouvez le faire avec des modèles dynamiques ( elasticsearch.org/Guide /reference/mapping/root-Object-type. HTML ). C'est une méthode plus complexe mais cela vous donne plus de flexibilité. Je pense que cette fonctionnalité était déjà présente dans 0,14, mais je ne suis pas sûr à 100%.


Bonjour Imotov, j'ai une autre question. Si je veux activer la mise en évidence des correspondances dans les résultats de la recherche, dois-je mentionner quoi que ce soit dans l'analyseur ou uniquement dans la requête? Vous sera utile si vous pouviez donner un exemple de la manière dont je peux activer la mise en évidence des matchs dans n'importe quel domaine.



6
votes

Quelque chose de neige ne fonctionne pas pour moi ... Je reçois des erreurs comme je l'ai mentionnée dans le commentaire à la réponse de @ imotov. J'ai utilisé Porter tige et ça a fonctionné parfaitement pour moi. Ceci est la configuration que j'ai utilisée: xxx


0 commentaires

6
votes

Etant donné que le filtre "Porterstem" est surséconomique, il est plus adapté si vous utilisez un filtre "minimal_english". "Porterster" crée des jetons similaires pour des mots tels que:

Recherche de 'Test' résultera de votre "test", "Tests", "Test", "Tester" et. al.

mais 'minimal_english' ne donnera que donner uniquement - "test" et "tests".


2 commentaires

Votre réponse n'a pas été marquée correcte car elle est arrivée beaucoup plus tard que la première, mais c'est évidemment une solution bien meilleure. L'analyseur de boule de neige est horriblement inexacte. Porterster est un peu mieux et pourrait être utilisable. Le kit est encore moins sensible et minimal_français est le moins sensible. Mais la boule de neige est horrible.


@Sekai dans votre code Java minimal_français peut être importé à partir d'org.apache.lucène.analysis.en.englishminimalaleStemFilter et pour utiliser dans une requête, ce sera "Filtre: minimal_frish"