web-dev-qa-db-fra.com

Comme la recherche dans Elasticsearch

J'utilise elasticsearch pour filtrer et rechercher à partir du fichier json et je suis novice dans cette technologie. Je suis donc un peu confus sur la façon d'écrire comme une requête dans elasticsearch.

select * from table_name where 'field_name' like 'a%'

Ceci est une requête mysql. Comment écrire cette requête dans Elasticsearch? J'utilise la version 0.90.7 d'elasticsearch.

17
Dixit Sourav

Je suggérerais fortement de mettre à jour votre version d'ElasticSearch si possible, il y a eu des changements importants depuis 0.9.x.

Cette question n'est pas assez précise, car il existe de nombreuses façons dont ElasticSearch peut remplir cette fonctionnalité, et elles diffèrent légèrement sur votre objectif global. Si vous cherchez à répliquer exactement cette requête SQL, dans ce cas, utilisez la requête générique ou la requête de préfixe.

Utilisation d'une requête caractère générique :

Remarque: Soyez prudent avec les recherches génériques, elles sont lentes. Évitez d'utiliser des caractères génériques au début de vos chaînes.

GET /my_index/table_name/_search
{
    "query": {
        "wildcard": {
            "field_name": "a*"
        }
    }
}

Ou Requête de préfixe

GET /my_index/table_name/_search
{
    "query": {
        "prefix": {
            "field_name": "a"
        }
    }
}

Ou correspondance partielle :

Remarque: N'utilisez pas [~ # ~] pas [~ # ~] aveuglément la correspondance partielle, alors qu'il existe des cas d'angle pour son utilisation, utilisation correcte des analyseurs c'est presque toujours mieux.

Cette requête exacte sera également équivalente à LIKE '%a%', qui, encore une fois, pourrait être mieux configuré avec une utilisation correcte du mappage et une recherche de requête normale!

GET /my_index/table_name/_search
{
    "query": {
        "match_phrase": {
            "field_name": "a"
        }
    }
}

Si vous lisez ceci en vous demandant comment interroger ES de la même manière pour la recherche au fur et à mesure, je suggère de lire Edge-ngrams , qui se rapportent à une bonne utilisation du mappage en fonction de ce que vous essayez de faire =)

GET /indexName/table_name/_search
{
    "query": {
        "match_phrase": {
            "field_name": "your partial text"
        }
    }
}

Vous pouvez utiliser "type" : "phrase_prefix" pour préfixer ou publier le correctif que vous recherchez Java pour le même:

AndFilterBuilder andFilterBuilder = FilterBuilders.andFilter();
 andFilterBuilder.add(FilterBuilders.queryFilter(QueryBuilders.matchPhraseQuery("field_name",
          "your partial text")));

Exemple donné et filtre pour que vous puissiez ajouter des filtres supplémentaires si vous le souhaitez. Vérifiez ceci pour plus de détails:

https://www.elastic.co/guide/en/elasticsearch/guide/current/slop.html

2
Pranav Mishra