I have noticed when using q.alt even if hl=true highlights are not returned.
When using distributed search, q.alt and hl, HighlightComponent.java
finishStage expects the highlighting NamedList of each shard (if hl=true)
but it will never be returned. It will end up with a NullPointerExcepion.
I have temporally solved it checking that highlight NamedList is always
returned for each shard. If it's not the case, highlights are not added to
the response:

  @Override
  public void finishStage(ResponseBuilder rb) {
   * boolean hasHighlighting = true ;*
    if (rb.doHighlights && rb.stage == ResponseBuilder.STAGE_GET_FIELDS) {

      Map.Entry<String, Object>[] arr = new
NamedList.NamedListEntry[rb.resultIds.size()];

      // TODO: make a generic routine to do automatic merging of id keyed
data
      for (ShardRequest sreq : rb.finished) {
        if ((sreq.purpose & ShardRequest.PURPOSE_GET_HIGHLIGHTS) == 0)
continue;
        for (ShardResponse srsp : sreq.responses) {
          NamedList hl =
(NamedList)srsp.getSolrResponse().getResponse().get("highlighting");
         * if(hl != null) {*
            for (int i=0; i<hl.size(); i++) {
             String id = hl.getName(i);
             ShardDoc sdoc = rb.resultIds.get(id);
             int idx = sdoc.positionInResponse;
             arr[idx] = new NamedList.NamedListEntry<Object>(id,
hl.getVal(i));
            }
*          } else {
            hasHighlighting = false;
          }*
        }
      }

      // remove nulls in case not all docs were able to be retrieved
*      if(hasHighlighting) {*
        rb.rsp.add("highlighting", removeNulls(new SimpleOrderedMap(arr)));
*      }*
    }
  }

Reply via email to