【问题标题】:Elasticsearch java API query behavior strangenessElasticsearch java API 查询行为异常
【发布时间】:2015-09-11 11:32:26
【问题描述】:

我在完全理解我尝试使用 java API (v1.7.1) 构建的 elasticsearch 查询的行为时遇到了一些麻烦。下面是最初的SearchRequestBuilder

SearchRequestBuilder builder = client.prepareSearch("my_index")
            .setTypes("my_document_type")
            .setSearchType(SearchType.DFS_QUERY_THEN_FETCH);

我有一组带有titlecontent 字段的索引文档。当我尝试像这样匹配 title 字段中的短语时;

builder.setQuery(QueryBuilders.matchPhraseQuery("title", keyword));

当然还有;

SearchResponse response = builder.execute().actionGet();

此查询的行为完全符合我的预期 - 我的搜索根据 title 字段的内容返回高度相关的结果 - 到目前为止一切顺利。

但是,当我尝试向构建器添加另一个查询时;

builder.setQuery(QueryBuilders.matchQuery("content", keyword));

我原来的非常相关的结果(基于标题内容)现在更难理解了。例如,搜索短语(关键字)“这是一个测试”将返回该短语逐字存在的文档(在标题中)——就像我说的那样,完美。然而,第二个查询的添加现在使那些以前相关的文档完全从结果中删除 - 无处可寻。即使相同的文本与以前相同的字段匹配。显然我做错了什么,我只是不明白什么 - 或如何实现将关键字与titlecontent 匹配并返回相关结果的期望行为,这意味着如果有一个非常接近的短语匹配title 我希望看到这些文件得分更高。我也试过提升没有效果;

builder.setQuery(QueryBuilders.matchPhraseQuery("title", keyword).boost(5.0f));
builder.setQuery(QueryBuilders.matchQuery("content", keyword));

任何帮助将不胜感激。

【问题讨论】:

    标签: java elasticsearch


    【解决方案1】:

    通过第二次调用setQuery,您不是添加查询 - 您是(顾名思义)设置查询,即您替换先前设置用新的查询。

    如果您想同时使用这两个查询,您需要使用复合查询combine them,例如bool

    builder.setQuery(QueryBuilders.boolQuery()
        .should(QueryBuilders.matchPhraseQuery("title", keyword).boost(5.0f))
        .should(QueryBuilders.matchQuery("content", keyword)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      相关资源
      最近更新 更多