【问题标题】:Retrieve a document from elastic search by matching two fields通过匹配两个字段从弹性搜索中检索文档
【发布时间】:2014-12-29 23:00:40
【问题描述】:

我的数据存储在弹性搜索中,如下所示

{  
   "identifier":{  
      "source":"source 1",
      "id":"22081070"
   },
   "title":"Book 1",
   "published":2011,
   "types":[  
      "type1",
      "type2, 
      "type3"
   ]
}

有没有办法检索具有特定“identifier.id”和“identifier.source”参数的文档?例如,我正在检索上述文档,其 id 作为输入,具有以下内容:

QueryBuilder queryBuilder = QueryBuilders.matchQuery("identifier.id", "22081070");
SearchResponse searchResponse = client.prepareSearch("test-index")
                .setTypes("type").setQuery(queryBuilder).execute().actionGet();

但我知道如何添加“identifier.source”作为匹配参数。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    试试这个:

    BoolQueryBuilder boolQuery = new BoolQueryBuilder();
    QueryBuilder queryBuilder1 = QueryBuilders.matchQuery("identifier.id", "22081070");
    QueryBuilder queryBuilder2 = QueryBuilders.matchQuery("identifier.source", "source 1");
    
    boolQuery.must(queryBuilder1).must(queryBuilder2);
    
    SearchResponse searchResponse = client.prepareSearch("test-index")
                    .setTypes("type").setQuery(boolQuery).execute().actionGet();
    

    【讨论】:

    • 谢谢它的工作,虽然我必须使用 termQuery 而不是 matchQuery。我似乎 matchQuery 不适用于“identifier.source”属性,即使它们都使用了相同的分析器,正如我在 _mapping (关键字分析器)中看到的那样。对这个问题有什么想法吗?
    • 当你说它不起作用时,它是什么意思?你有例外吗?错误信息?如果是,有什么错误信息?
    • 返回零个文档
    • "term" 是 "not_analyzed" 所以,无论你给它什么,它都会照原样接受,没有变化。您在termQuery 中添加了什么值?
    • @salvador,无论@GlenRSmith 说什么:-)。正如我之前提到的,您的 source 1 测试使用 match 进行分析,但 not_analyzed 使用 term 进行分析。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2022-12-17
    • 2017-07-01
    • 2018-08-05
    • 1970-01-01
    相关资源
    最近更新 更多