ElasticSearch 使字段不可搜索 java

ElasticSearch Make Field non-searchable from 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 中完成此操作。请提供任何帮助或帮助 link ?

在地址字段上使用 index option 作为 false,默认情况下为 true 以使其不可搜索。正如在同一个官方 ES link:

中提到的

The index option controls whether field values are indexed. It accepts true or false and defaults to true. Fields that are not indexed are not queryable.

让我告诉你如何使用 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 异常,它不可搜索

"caused_by": { "type": "illegal_argument_exception", "reason": "Cannot search on field [address] since it is not indexed." }

RestHighLevelClient 写另一个答案因为另一个答案对不使用 Rest 客户端的人有用并且在第一个答案中添加它会使它太长。

注意:您传递的 type 在 ES 7.X 中已弃用,而我使用的是 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);

要点

  • 为了说明目的,我只使用了 2 个字段,其中一个是 address 字段,它是不可搜索的,为此我使用了 address.put("index", false); ,而 name是可搜索字段,但该选项不存在。
  • 我使用此 official ES doc 中可用的 Map 方法创建了 index mapping
  • 您可以使用 mapping REST API.
  • 检查此代码创建的映射
  • 下面是在我的系统中为这段代码生成的映射,你可以看到,地址字段中添加了index: false
{
  "employee": {
    "mappings": {
      "properties": {
        "address": {
          "type": "text",
          "index": false
        },
        "name": {
          "type": "text"
        }
      }
    }
  }
}
  • 您可以使用上一个答案中提到的相同搜索 JSON 来测试它是否不可搜索。