【问题标题】:ElasticSearch Search for Field Values does not returnElasticSearch 搜索字段值不返回
【发布时间】:2020-08-27 14:19:10
【问题描述】:

假设我在 Elastic Search 中有一个文档,其中包含 _source 中的“provider”字段。

我尝试了很多查询,但似乎都没有返回具有搜索值的文档。

文档:

"_source" : {
      "jobs" : [ ],
      "provider" : {
        "id" : "1",
        "name" : "Coursera"
      },
      "sckLevels" : [ ],
      "scks" : [ ],
      "trArea" : [ ],
      "trElems" : [ ],
      "training" : {
        "description" : "Cyber sec desc",
        "id" : "0",
        "img" : "img link",
        "link" : "https://google.com",
        "name" : "Cyber sec",
        "trainingProvID" : "1"
      }

我的查询代码是:

SearchRequest searchRequest = new SearchRequest(index);
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.termQuery("provider", "Coursera"));
    searchRequest.source(sourceBuilder);
this.multiRequest.add(searchRequest);

我的回复是空白的。

谢谢。

【问题讨论】:

  • 注意:在询问 ES 问题时,请始终提供您的映射、示例文档和预期结果,但我的回答中提到的问题很少,请修复它们,它应该可以工作。

标签: java elasticsearch liferay


【解决方案1】:

您的 Elasticsearch 查询肯定没有什么问题

  1. 似乎provider 字段是对象或嵌套类型,而在您的查询中您只是提到Coursera 但它应该与provider 字段的name 子字段匹配并基于对象或嵌套数据类型,您需要修改您的查询。

  2. 您正在使用term query,它未分析并用于关键字,即完全匹配,而如果您的name 字段定义为text,它将在索引时小写,Coursera 与大写C不匹配,您需要在文本字段上使用match 查询。

【讨论】:

    【解决方案2】:

    谢谢,嵌套是个问题。我以为它会对对象进行搜索。

    遇到了很好的线程。

    这样解决了:

    SearchRequest searchRequest = new SearchRequest(index);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchQuery("provider.name", "Coursera"));
        searchRequest.source(sourceBuilder);
    
        this.multiRequest.add(searchRequest);
    

    【讨论】:

    • 如果您支持并接受我发布的答案,我们将不胜感激,因为它指出了问题(嵌套和术语查询)并为您的代码解决方案 +1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 2021-03-10
    • 1970-01-01
    相关资源
    最近更新 更多