当前位置: 首页 > 面试题库 >

Elasticsearch5.5高亮字段不起作用

南门新知
2023-03-14
问题内容

我已经测试了elasticsearch突出显示字段功能,并且工作正常。我使用了 elasticsearch2.4.4spring-data-
elasticsearch-2.0.0.RELEASE

我最近将 elasticsearch 升级到 5.5.0spring-data-elasticsearch-3.0.0.M4

当我测试相同的代码时,突出显示不会发生

下面是示例代码

SearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices("occindex")
                .withPageable(new PageRequest(0, mySpecification.getNoOfRecords()))
                .withQuery(QueryBuilders.multiMatchQuery(
                        searchText.toLowerCase()).field("transformedTitle", 10.0f).
                        minimumShouldMatch("50%").fuzziness(Fuzziness.ONE).prefixLength(3)
                        .field("transformedDesription").type(MultiMatchQueryBuilder.Type.BEST_FIELDS))
                .withHighlightFields(
                        new HighlightBuilder.Field("transformedTitle").preTags("<span style='background-color: #FFFF00'>")
                                .postTags("</span>"),
                        new HighlightBuilder.Field("transformedDesription").fragmentSize(250).numOfFragments(3)
                                .preTags("<span style='background-color: #FFFF00'>").postTags("</span>"))
                .build();




        Page<MyResultRecord> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery,
                MyResultRecord.class, new SearchResultMapper() {
                    @Override
                    public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
                        List<MyResultRecord> chunk = new ArrayList<MyResultRecord>();
                        for (SearchHit searchHit : response.getHits()) {
                            if (response.getHits().getHits().length <= 0) {
                                return null;
                            }
                            MyResultRecord myResultRecord = new MyResultRecord();
                            myResultRecord.setRecordId(searchHit.getId());

                            Map<String, Object> source = searchHit.getSource();
                            myResultRecord.setRisk((String) source.get("actualRisk"));

                            String highlightedTitle = null;
                            System.out.println( " Check the highlighted fileds  " + searchHit.getHighlightFields());
                            System.out.println( " Is this null ?? " + searchHit.getHighlightFields().get("transformedTitle"));

                            if (searchHit.getHighlightFields().get("transformedTitle") != null)
                                highlightedTitle = searchHit.getHighlightFields().get("transformedTitle").fragments()[0]
                                        .toString();
                            else
                                highlightedTitle = (String) source.get("transformedTitle");

                            myResultRecord.setHighlightedTitle(highlightedTitle);
                            myResultRecord.setScore(searchHit.getScore());

                            chunk.add(myResultRecord);
                        }
                        if (chunk.size() > 0) {
                            return new AggregatedPageImpl(chunk);
                        }
                        return null;
                    }
                });

为了突出显示elasticsearch5.5.0中的字段,是否需要进行任何代码更改?

当我在elasticsearch日志中打印查询时,我发现只有一个突出显示字段传递给elasticsearch

{  
   "from":0,
   "size":2,
   "query":{  
      "multi_match":{  
         "query":" My Query String",
         "fields":[  
            "transformedDesription^1.0",
            "transformedTitle^1.0"
         ],
         "type":"best_fields",
         "operator":"OR",
         "slop":0,
         "prefix_length":0,
         "max_expansions":50,
         "lenient":false,
         "zero_terms_query":"NONE",
         "boost":1.0
      }
   },
   "highlight":{  
      "fields":{  
         "transformedDesription":{  
            "pre_tags":[  
               "<bold>"
            ],
            "post_tags":[  
               "</bold>"
            ]
         }
      }
   }
}

调试时,我发现NativeSearchQuery具有两个突出显示的字段,但是发送到ElasticSearch的最终查询仅请求一个突出显示字段。


问题答案:

通过更改
org.springframework.data.elasticsearch.core.ElasticsearchTemplate.doSearch中*
的以下代码来使其工作
*

现有代码

if (searchQuery.getHighlightFields() != null) {
            for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) {
                searchRequest.highlighter(new HighlightBuilder().field(highlightField));
            }

        }

修改后的代码

if (searchQuery.getHighlightFields() != null) {
            HighlightBuilder myBuilder = new HighlightBuilder();
            for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) {
                myBuilder.field(highlightField);

            }
            searchRequest.highlighter(myBuilder);
        }


 类似资料:
  • 我已经测试了elastic search highlight field函数,它运行良好。我使用了elastic search 2.4.4和spring-data-elasticsearch-2.0.0.RELEASE 示例代码在下面的帖子中 如何使用Spring data elasticsearch提供高亮显示 我最近将elastic search升级到5.5.0和spring-data-ela

  • 问题内容: 将div高度设置为0px似乎无效。 div展开以显示其内容,我们如何防止这种情况发生? 问题答案: 如果您 真的 想确定它没有高度,可以使用以下方法: 如果您在IE上仍然遇到问题,也可以添加 在针对IE的样式表中添加了条件注释。这将触发IE中的hasLayout属性。 并且display:none与将其设置为零高度不同。只需查看各种clearfix解决方案,以解决 不 从流程中删除它的

  • JavaFx文本字段。setText()方法不工作当从另一个线程调用时,我正在从另一个线程调用received()方法。但我无法将文本设置为文本字段,所以我使用了平台。稍后运行,但它不起作用。 DepartmentsController是我的控制器类,它接收了从另一个线程调用的方法(kryonet thread kryonet是一个高级网络库)。 我有主类,是启动的javafx应用程序,初始化控制

  • 我试图在最新的AndroidLollipop预览版本中使用elevation属性。我将targetSdk设置为21,将主题设置为Material。接下来,我在TextView中添加了一个背景形状,并将标高设置为8dp,但TextView没有显示任何阴影迹象。这是在运行Lollipop预览的Nexus7上。我还有什么要考虑的吗? 布局如下: 这是可绘制的背景: 以下是文本视图:

  • 问题内容: 当我将分析器与Edgengram(最小= 3,最大= 7,前面)+ term_vector = with_positions_offsets一起使用时 使用具有text =“ CouchDB”的文档 当我搜索“ couc”时 我的重点是“ cou”而不是“ couc” 看来我的重点只是在最小匹配令牌“ cou”上,而我希望是在精确令牌(如果可能)上或至少在找到的最长令牌上。 无需使用t

  • 我使用Lombok删除样板代码。我试图打印出一个实体到控制台,但我得到了一个StackOverflow错误。该实体与另一个实体具有双向关系,因此我想从toString方法中排除该实体。 我的实体如下所示: 这是我第一次尝试使用,它似乎没有行为。我用错了吗?当我在Foo对象上调用toString时,我只想打印出和。 编辑 我熟悉从顶层注释中排除或包含字段的替代方法。我正试图避免这种情况。我只想在类级