使用 Java 从 Elasticsearch 7.3 的字段中查询
Query from a field of Elasticsearch 7.3 using Java
我有以下代码工作正常并且 return 正在处理文档。我想根据文档中的 only one field
进行搜索,并应 return 所有文档中该字段的值。
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
字段和 return 在此搜索中 return 编辑的所有文档中该字段的值。
比方说,我查询 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"
}]
I need it to search only Name field and return the value of that field
from all documents that returned in this search.
不是直截了当的。您需要如下更改查询字符串以仅处理名称字段。
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"
}
}
}
你可以做到 source controlling in code and Hope you are interested in query_string
way only. If you are open to other ways, you can use this
然后要转换为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);
我有以下代码工作正常并且 return 正在处理文档。我想根据文档中的 only one field
进行搜索,并应 return 所有文档中该字段的值。
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
字段和 return 在此搜索中 return 编辑的所有文档中该字段的值。
比方说,我查询 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"
}]
I need it to search only Name field and return the value of that field from all documents that returned in this search.
不是直截了当的。您需要如下更改查询字符串以仅处理名称字段。
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"
}
}
}
你可以做到 source controlling in code and Hope you are interested in query_string
way only. If you are open to other ways, you can use this
然后要转换为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);