6
votes

Recherche de plusieurs chaînes dans tous les champs de Elasticsearch à l'aide de Java API

J'ai un index élasticsearch ayant des utilisateurs avec des champs comme .. "Nom": "kai" "Age": "23" "Emplacement": "Delhi, Inde" "Tag": ["Recherche", "nosql"] etc.

Je veux interroger plusieurs chaînes dans tous les domaines de l'utilisateur (par exemple, ["NOSQL", "Delhi"]). Est-il possible d'utiliser Java API? P>

Voici un échantillon de code que j'utilise. (Mais il n'est pas pertinent de la question) son juste de connaître les objets que j'utilise actuellement. P>

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
                .must(QueryBuilders.matchAllQuery());
        if(location!=null) {
            queryBuilder.must(QueryBuilders.matchQuery("location",location));
        }
        BoolFilterBuilder filerBuilder=FilterBuilders.boolFilter();     
        for(String skill:skills){
            filerBuilder.must(FilterBuilders.rangeFilter("tags."+skill).from(0));
        }
        filerBuilder.must(FilterBuilders.queryFilter(queryBuilder));
        if(age!=null) {
            filerBuilder.must(FilterBuilders.rangeFilter("age").from(age[0]).to(age[1]));
        }
        SearchResponse response = client.prepareSearch("skillbin")
                .setTypes("stackdump")
                .setSearchType(SearchType.QUERY_AND_FETCH)
                .setQuery(queryBuilder)   
                .setPostFilter(filerBuilder)
                .addSort("reputation", SortOrder.DESC)
                .execute()
                .actionGet();
        SearchHits hits=response.getHits(); 


0 commentaires

3 Réponses :


1
votes

Si vous utilisez Analyseur standard, Elasticsearch jette tous les mots par défaut à l'aide du tokéniseur d'espace blanc.

Vous pouvez utiliser Query Query String Pour votre recherche dans ce cas, où vous pouvez ajouter plusieurs champs à rechercher. L'opérateur par défaut de la requête de Query String est également "ou". Donc, si votre terme de recherche est "Nosql Delhi" (comme dans votre cas), il est traduit dans "NOSQL ou DELHI" et recherché dans tous les champs spécifiés dans la requête. De cette façon, vous pouvez rechercher plusieurs termes dans plusieurs champs.

espère que cela aide.


0 commentaires

8
votes

Dans l'API Java, vous pouvez interroger sur le champ "_all", qui incluent par défaut tous les champs d'un document. Une solution alternative est utilisée MULTIMATCHQUERY qui est plus flexible et vous permet de spécifier une liste de champs que vous souhaitez interroger contre.

Voici quelques échantillons de code sur la manière d'accéder à" _all " Champ ainsi que Comment créer un MultimatchQuery en utilisant MultimatchQueryBuilder et QueryBuilders . MULTIMATCHQUERY le long d'un Query pour rechercher dans tous les champs :: xxx


1 commentaires

Merci @hexabunny.



0
votes

Pour Java élastique Resthighlevelclient:

Remplacez "_All" avec "*".

String QueryString = "Nosql Delhi";

chaîne allfield = "*";

MultimatchQueryBuilder MMQB = QueryBuilders.Multimbuceery (QueryString, Allfield);


0 commentaires