Java:在elasticsearch中搜索索引中的多个字段

时间:2018-02-12 05:26:42

标签: java elasticsearch

我在这里想要实现的是在索引中搜索两个字段。 结构在kibana中看起来像这样:

POST arempris/emptagnames
{
  "mappings" : {
    "emptags":{
          "properties": {
                "employeeid": {
                  "type":"integer"
                },
                "tagName": {
                  "type": "text",
                  "fielddata": true,
                  "analyzer": "english"
                }
            }    
        }
    }
}

在java中,我编写了一个代码来搜索名为“tagName”的单个字段,并以jsonArrayBuilder格式返回searchHits。

与此类似,在这种情况下,是否可以先搜索employeeid,然后返回与该employeeid关联的tagNames列表?

对于RDBMS,我的查询看起来像: 从filemetadata中选择tagNames,其中employeeid = 124,tagName就像%slip%,这是我想要使用QueryBuilder实现的。是否可以实施?

在索引中搜索单个字段的java代码是:

Client esclient = getClient();

        String index = "arempris";
        String type = "tags";

        QueryBuilder query = QueryBuilders.matchPhrasePrefixQuery("tagName", tagName);
        SearchResponse response = esclient.prepareSearch(index).setTypes(type)
                .setQuery(query)
                .execute().actionGet();

        hits = response.getHits().getHits();
        System.out.println(hits.length);
        for (int i = 0; i < hits.length; i++) {
            System.out.println(hits[i].getSourceAsString());
        }

非常感谢您的帮助和提前感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用带有bool query子句的must来获得AND行为。您可以使用term查询获取完全匹配,并wildcard查询like

BoolQueryBuilder query = new BoolQueryBuilder();
query.must(new WildcardQueryBuilder("tagName", "*slip*"));
query.must(new TermQueryBuilder("employeeid", 123));