【问题标题】:ElasticSearch search by _source fieldsElasticSearch 按 _source 字段搜索
【发布时间】:2018-10-12 01:37:07
【问题描述】:

我需要实现一个搜索引擎。像 google / yahoo 搜索一样,在搜索组件中,如果输入任何键,它应该会找到匹配项并显示。为此,我创建了与弹性搜索集成的 Spring Boot 项目。

我使用 logstash 在弹性搜索中为我的 Oracle 数据库创建了索引。通过使用下面的代码,我能够根据弹性搜索索引 id 获取记录。

private final String INDEX = "bookdata";
private final String TYPE = "books";

public Map<String, Object> getBookById(String id){
    GetRequest getRequest = new GetRequest(INDEX, TYPE, id);
    GetResponse getResponse = null;
    try {
        getResponse = restHighLevelClient.get(getRequest);
    } catch (java.io.IOException e){
        e.getLocalizedMessage();
    }
    Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
    return sourceAsMap;
}

上面的代码运行良好,可以根据ID 获取 Book。但我必须要作者或书名。

请在 Kibana 的 Elastic 搜索中找到我的索引文档

{
  "took": 34,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "bookdata",
        "_type": "books",
        "_id": "72c58f1a-7bfe-41be-a7f4-ee0aca3f4cf4",  //able to search by ID
        "_score": 1,
        "_source": {
          "id": "72c58f1a-7bfe-41be-a7f4-ee0aca3f4cf4",
          "title": "Java Always",  // want to search by Title
          "author": "JournalDev", // or want to search by author
          "price": 99.1
        }
      }
}

不是很确定,如何搜索作者或书名。

【问题讨论】:

  • 查看 Elasticsearch 中的术语和匹配查询

标签: java elasticsearch kibana


【解决方案1】:

您需要使用 search API 而不是 Get API。

// create the search request
SearchRequest searchRequest = new SearchRequest(INDEX); 
searchRequest.types(TYPE);

// create the match query on the author field
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("author", "JournalDev"); 
searchSourceBuilder.query(matchQueryBuilder); 
searchRequest.source(searchSourceBuilder);

// send the request
SearchResponse searchResponse = restHighLevelClient.search(searchRequest);

// read the response
SearchHit[] searchHits = searchResponse.getHits().getHits();
for (SearchHit hit : searchHits) {
    // get each hit as a Map
    Map<String, Object> sourceAsMap = hit.getSourceAsMap();
    String documentTitle = (String) sourceAsMap.get("title");
    ...
}

【讨论】:

  • 下一行抛出错误getResponse = restHighLevelClient.get(searchRequest); 错误:The method get(GetRequest, Header...) in the type RestHighLevelClient is not applicable for the arguments (SearchRequest)
  • 我想将searchResponse 映射到 Map
  • 您可以按照here 的说明进行操作。我已经用一个例子更新了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 2018-12-28
相关资源
最近更新 更多