用标签包围多个单词 - Java中的ElasticSearch Highlighter

时间:2014-06-13 08:07:57

标签: java elasticsearch highlight

使用突出显示执行ElasticSearchs查询时,是否可以使用突出显示标记包围多个单词?

例如,当我执行查询“ajax basics”时,我得到:

someText... <a href='#' class='highlightedTerm'>ajax</a> <a href='#' class='highlightedField'>basics</a> someText...

这就是我想要的:

someText... <a href='#' class='highlightedTerm'>ajax basics</a> someText...

我正在使用这些设置进行荧光笔和查询:

SearchResponse response = getClient().prepareSearch("user")
    .setTypes("document")
    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
    .setPostFilter(privacyFilter)
    .setQuery(qb)
    .setFrom(first)
    .setSize(pageSize)
    .setExplain(true)
    //
    // Highlight
    .addHighlightedField("fileName")
    .addHighlightedField("content")
    .setHighlighterOptions(highlighterOptions)
    .setHighlighterPreTags("<a href='#' class='highlightedTerm'>")
    .setHighlighterPostTags("</a>")
    // -------------------------------------
    //
    .addFields("*", "_source")
    .execute()
    .actionGet();

我试图从边界字符中删除 space

Map<String, Object> highlighterOptions = new HashMap<>();
highlighterOptions.put("boundary_chars", "s.,!?\\t\\n");

但是,结果是一样的。

由于

弗拉基米尔

1 个答案:

答案 0 :(得分:2)

我发现了什么问题。我使用普通荧光笔而不是快速矢量荧光笔。只需添加快速矢量荧光笔即可解决我的问题。

要启用快速矢量荧光笔,我为我执行搜索的类型添加了特定的映射

准确地说,我添加了

.field("term_vector", "with_positions_offsets")

在我想要突出显示的字段上。

// Create mapping
XContentBuilder xb = XContentFactory.jsonBuilder()
        .startObject()
        .startObject("document")
        // - document
        .startObject("properties")
        // - properties
        //
        .startObject("content")
        .field("type", "string")
        .field("term_vector", "with_positions_offsets")
        .endObject()
        //
        //
        .startObject("contentType")
        .field("type", "string")
        .endObject()
        //
        //
        .startObject("fileName")
        .field("type", "string")
        .endObject()
        //
        //
        .startObject("fileSize")
        .field("type", "long")
        .endObject()
        //
        //
        .startObject("openable")
        .field("type", "string")
        .endObject()
        //
        //
        .startObject("ownerUserId")
        .field("type", "string")
        .endObject()
        //
        //
        .startObject("privacy")
        .field("type", "string")
        .endObject()
        //
        //
        .startObject("searchable")
        .field("type", "string")
        .endObject()
        //
        // - end properties
        .endObject()
        // - end document
        .endObject()
        .endObject();

// Prepare mapping
PutMappingRequestBuilder pmrb = client.admin().indices()
        .preparePutMapping("user")
        .setType("document");

pmrb.setSource(xb);

// Create type and mapping
PutMappingResponse response = pmrb.execute().actionGet();
if (!response.isAcknowledged()) {
    LOG.info("Error while creating mapping for user document.");
} else {
    LOG.info("Mapping created for user document.");
}

有关该主题的一些信息:link