我目前正在通过我的java应用程序进行弹性搜索。我知道如何使用RestHighLevelClient对Java pojo进行索引。我怎么能只在新的领域搜索,而不是完整的pojo。?
public class Employee{
private long id;
private String name;
private String designation;
private String address; //want to index but not searchable in elastic search
}
我的索引代码如下,运行良好:
public String saveToEs(Employee employee) throws IOException {
Map<String, Object> map = objectMapper.convertValue(employee, Map.class);
IndexRequest indexRequest =
new IndexRequest(INDEX, TYPE, employee.getId().toString()).source(map, XContentType.JSON);
IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
我需要用java做这件事。有什么帮助或好的链接吗?
为RestHighLevelClient
编写另一个答案对于不使用Rest客户端的人来说很有用,在第一个答案中添加这个答案会使其过长。
注意:您正在传递在ES 7.X中不推荐使用的type
,而我使用的是ES 7.X版本,因此我的代码是根据7.X编写的。
CreateIndexRequest request = new CreateIndexRequest("employee");
Map<String, Object> name = new HashMap<>();
name.put("type", "text");
Map<String, Object> address = new HashMap<>();
address.put("type", "text");
address.put("index", false);
Map<String, Object> properties = new HashMap<>();
properties.put("name", name);
properties.put("address", address);
Map<String, Object> mapping = new HashMap<>();
mapping.put("properties", properties);
request.mapping(mapping);
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
要点
- 我只使用了两个字段进行说明,其中一个是不可搜索的
address
字段,为此我使用了address.put("index", false);
,而name
是可搜索的字段,并且不存在此选项 - 我使用Map方法创建了
index mapping
,该方法在这个官方ES文档中可用 - 您可以使用映射REST API检查此代码创建的映射
- 下面是在我的系统中为该代码生成的映射,您可以看到,
index: false
添加在地址字段中
{ "employee": { "mappings": { "properties": { "address": { "type": "text", "index": false }, "name": { "type": "text" } } } } }
- 您可以使用上一个答案中提到的相同搜索JSON来测试它是否不可搜索
在地址字段中使用false的index选项,默认情况下为true以使其不可搜索。正如在同一官方ES链接中提到的:
index选项控制是否对字段值进行索引。它接受true或false,并默认为true。未编入索引的字段为不可查询。
让我向您展示如何使用REST API测试它,然后使用java代码(使用REST-high level客户端(来完成它
映射
{
"mappings": {
"properties": {
"id": {
"type": "long"
},
"name": {
"type": "text"
},
"designation": {
"type": "text"
},
"address": {
"type": "text",
"index" : false --> made `index` to false
}
}
}
}
索引少数文档
{
"address" : "USA",
"name" : "Noshaf",
"id" : 234567892,
"designation" : "software engineer"
}
{
"address" : "USA california state",
"name" : "opster",
"id" : 234567890,
"designation" : "software engineer"
}
一个基于address
字段的JSON格式的简单匹配搜索查询
{
"query": {
"match" : {
"address" : "USA"
}
}
}
Elasticsearch明确提到的例外情况是,它不可搜索
"原因":{"type":"非法_参数_异常","reason":">无法在字段[address]上搜索,因为字段未编入索引。"}