簡體   English   中英

使用 Java 從 Elasticsearch 7.3 的字段中查詢

[英]Query from a field of Elasticsearch 7.3 using Java

我的以下代碼工作正常並返回文檔。 我想only one field進行搜索,並應從所有文檔中返回該字段的值。

        RestHighLevelClient client;

        QueryBuilder matchQueryBuilder = QueryBuilders.queryStringQuery("elon");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(matchQueryBuilder);
        sourceBuilder.from(0);
        sourceBuilder.size(10);
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        SearchRequest searchRequest = new SearchRequest(ELASTIC_SEARCH_INDEX);
        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

我需要它只搜索Name字段並從在此搜索中返回的所有文檔中返回該字段的值。

比方說,我查詢Elon ,它應該響應List<String> "lily Elon musk", "parker Elon ",Elon musk 77" 並忽略其他字段。

映射

{
students: {
mappings: {
properties: {
students: {
properties: {
courseTitle: {
type: "text",
fields: {
keyword: {
type: "keyword",
ignore_above: 256
}
}
},
courseCode: {
type: "text",
fields: {
keyword: {
type: "keyword",
ignore_above: 256
}
}
},
name: {
type: "text",
fields: {
keyword: {
type: "keyword",
ignore_above: 256
}
}
},
courseGrade: {
type: "text",
fields: {
keyword: {
type: "keyword",
ignore_above: 256
}
}
}
}
}
}
}
}
}

樣本文件

students: [
{
courseCode: " HM101",
courseTitle: "ICP",
courseGrade: "A"
},
{
courseCode: " CS101",
courseTitle: "electronice",
courseGrade: "B+"
},
{
name: "elon musk"
}]

我需要它只搜索名稱字段並從在此搜索中返回的所有文檔中返回該字段的值。

不是直截了當的。 您需要如下更改查詢字符串以僅處理名稱字段。

JAVA方式:

QueryBuilder matchQueryBuilder = 
               QueryBuilders.queryStringQuery("elon").defaultField("name");

String[] includeFields = new String[] {"name"};
String[] excludeFields = new String[] {"user"};
sourceBuilder.fetchSource(includeFields, excludeFields);

清楚的:

  {
    "_source":
      ["name"],
    "query": {
        "query_string" : {
            "query" : "name:elon"

        }
    }

}

您可以在代碼中進行源代碼控制,希望您只對query_string方式感興趣。 如果您對其他方式持開放態度,則可以使用

然后要轉換為List<String> ,您需要迭代響應並將其添加到List

SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
List<String> names = new ArrayList<String>();
for (SearchHit hit : searchHits) {
   Map<String, Object> sourceAsMap = hit.getSourceAsMap();
   names.add(sourceAsMap.get("name"));
}

它適用於

        String[] includeFields = new String[]{"students.name"};
        sourceBuilder.fetchSource(includeFields, null);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM