ElasticSearch使字段无法从java中搜索



我目前正在通过我的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]上搜索,因为字段未编入索引。"}

相关内容

  • 没有找到相关文章

最新更新