【问题标题】:ElasticSearch Field boosting using java api使用 java api 提升 ElasticSearch 字段
【发布时间】:2013-03-02 05:56:00
【问题描述】:

我是 ES 新手,正在尝试使用 java api 进行搜索。我无法弄清楚如何使用 java api 提供特定于归档的提升。 这是示例: 我的索引文档如下所示:

_source": {

"th_id": 1,
"th_name": "test name",
"th_description": "test desc",
"th_image": "test-img",
"th_slug": "Make-Me-Smart",
"th_show_title": "Coast Tech Podcast",
"th_sh_category": "Alternative Health

}

当我搜索关键字时,如果它们在“th_name”中找到,与在其他一些字段中找到的关键字相比,我想提高结果。 目前我正在使用以下代码进行搜索:

QueryBuilder qb1 = QueryBuilders.multiMatchQuery(keyword, "th_name", "th_description", "th_show_title", "th_sh_category");
SearchResponse response = client.prepareSearch("talk").setTypes("themes")
        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setQuery(qb1)
        .setFrom(start).setSize(maxRows)
        .setExplain(true).execute().actionGet();

如果在“th_name”字段中找到关键字与在其他字段中找到关键字相比,我可以在查询时做些什么来提升文档?

【问题讨论】:

    标签: search elasticsearch


    【解决方案1】:

    【讨论】:

    • 嘿,链接无效
    • 嗨,我不明白在这种情况下这对我有什么帮助
    【解决方案2】:

    编辑:这已更改并且不再在 ES 6.x 及更高版本中工作。

    您还应该能够直接在多重匹配查询中提升字段:

    "multi_match 查询支持通过字段 json 字段中的 ^ 表示法进行字段提升。

    {
      "multi_match" : {
        "query" : "this is a test",
        "fields" : [ "subject^2", "message" ]
      } 
    }
    

    在上面的示例中,主题字段中的命中是消息字段中的 2 倍。"

    在 java-api 中,只需使用 MultiMatchQueryBuilder:

    MultiMatchQueryBuilder builder = 
    new MultiMatchQueryBuilder( keyword, "th_name^2", "th_description", "th_show_title", "th_sh_category" );
    

    免责声明:未经测试

    【讨论】:

    • 这是完美的。感谢您也提供 java 版本。
    • 这将给出异常,因为事情最终归结为:“fields”:[“subject^1.0^2”,“message^1.0”]
    【解决方案3】:

    接受的答案对我不起作用。我使用的ES版本是6.2.4

    QueryBuilders.multiMatchQuery(keyword)
                                .field("th_name" ,2.0f)
                                .field("th_description")
                                .field("th_show_title")
                                .field("content")
    

    希望对其他人有所帮助。

    【讨论】:

    • 这应该是公认的答案。我试了一下,效果很好。
    • 您能解释一下您的解决方案吗?那个“字段”是什么意思?
    • @RoyLeibovitz 您要匹配的字段。而且由于是 multimatch ,所以可以指定多个字段。
    • @Richa 我只想对所有字段都这样做,而不是指定每个字段。我希望它在所有细分中搜索
    • @RoyLeibovitz 您可以跳过字段方法并使用QueryBuilders.multiMatchQuery(keyword)。正如此处elastic.co/guide/en/elasticsearch/reference/current/… 指定的那样,这将默认为所有字段。
    猜你喜欢
    • 1970-01-01
    • 2014-09-13
    • 2017-06-16
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2016-12-03
    • 2012-09-07
    • 1970-01-01
    相关资源
    最近更新 更多