简短版本:是否有可能获得highlight_query交付的功能来突出显示inner_hits结果?

长版:
请考虑以下映射:

{
  "settings": {
    "number_of_replicas": 0,
    "number_of_shards": 1
  },
  "mappings": {
    "docs": {
      "properties": {
        "doctext": {
          "type": "string",
          "store": "yes"
        },
        "sentences": {
          "type": "nested",
          "properties": {
            "text": {
              "type": "string",
              "store": "yes"
            }
          }
        }
      }
    }
  }
}

如您所见,这里有doctextsentences字段。想法是将文档文本分为句子,以允许基于句子的搜索。

让它作为示例文档:
{
  "doctext": "I will do a presentation. I talk about lions and show images of zebras. I hope it will be fun.",
  "sentences": [
    {
      "text": "I will do a presentation."
    },
    {
      "text": "I talk about lions and show images of zebras."
    },
    {
      "text": "I hope it will be fun."
    }
  ]
}

现在,我可以搜索整个文本以及单个句子,甚至可以突出显示这两个句子:
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "doctext": "zebras"
          }
        },
        {
          "nested": {
            "path": "sentences",
            "query": {
              "match": {
                "sentences.text": "zebras"
              }
            },
            "inner_hits": {
              "highlight": {
                "fields": {
                  "sentences.text": {}
                }
              }
            }
          }
        }
      ]
    }
  },
  "_source": false,
  "highlight": {
    "fields": {
      "doctext": {
        "highlight_query": {
          "match": {
            "doctext": "lions"
          }
        }
      }
    }
  }
}

请不要以下内容:
  • nested上的sentences查询
  • 该查询的inner_hits部分
  • 第二个highlight_queryhighlight部分,而不是inner_hits

  • 发出此查询将导致以下响应:
    "hits": [
          {
            "_index": "documents",
            "_type": "docs",
            "_id": "123456",
            "_score": 0.6360315,
            "highlight": {
              "doctext": [
                "I will do a presentation. I talk about <em>lions</em> and show images of zebras. I hope it will be fun."
              ]
            },
            "inner_hits": {
              "sentences": {
                "hits": {
                  "total": 1,
                  "max_score": 0.5291085,
                  "hits": [
                    {
                      "_index": "documents",
                      "_type": "docs",
                      "_id": "123456",
                      "_nested": {
                        "field": "sentences",
                        "offset": 1
                      },
                      "_score": 0.5291085,
                      "_source": {
                        "text": "I talk about lions and show images of zebras."
                      },
                      "highlight": {
                        "sentences.text": [
                          "I talk about lions and show images of <em>zebras</em>."
                        ]
                      }
                    }
                  ]
                }
              }
            }
          }
        ]
    

    请注意,尽管我们搜索斑马,但在doctext字段中如何突出显示狮子。inner_hits会突出显示那些内容,因为我们未指定其他操作。但我想像doctext高亮一样,用内在命中突出显示狮子。

    我试图将查询的inner_hits部分更改为
     "inner_hits": {
              "highlight": {
                "fields": {
                  "text": {
                    "highlight_query": {
                      "match": {
                        "sentences.text": "lions"
                      }
                    }
                  }
                }
              }
            }
    

    但这导致以下异常:
    Failed to execute phase [query_fetch], all shards failed; shardFailures {[9-pMHRPsRiyITgsRNFnkEA][documents][0]: RemoteTransportException[[Fafnir][127.0.0.1:9300][indices:data/read/search[phase/query+fetch]]]; nested:         SearchParseException[failed to parse search source [{
          "query": {
            "bool": {
              "should": [
                {
                  "match": {
                    "doctext": "fun"
                  }
                },
                {
                  "nested": {
                    "path": "sentences",
                    "query": {
                      "match": {
                        "sentences.text": "zebras"
                      }
                    },
                    "inner_hits": {
                      "highlight": {
                        "fields": {
                          "sentences.text": {
                            "highlight_query": {
                              "match": {
                                "doctext": "lions"
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              ]
            }
          },
          "_source": false,
          "highlight": {
            "fields": {
              "doctext": {
                "highlight_query": {
                  "match": {
                    "doctext": "lions"
                  }
                }
              }
            }
          }
        }]]; nested: NullPointerException; }
    at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction.onFirstPhaseResult(        TransportSearchTypeAction.java:228)
    at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction$1.onFailure(    TransportSearchTypeAction.    java:174)
            at org.elasticsearch.action.ActionListenerResponseHandler.handleException(ActionListenerResponseHandler.java:46)
            at org.elasticsearch.transport.TransportService$DirectResponseChannel.processException(TransportService.java:821)
            at org.elasticsearch.transport.TransportService$DirectResponseChannel.sendResponse(TransportService.java:799)
            at org.elasticsearch.transport.TransportService$4.onFailure(TransportService.java:361)
            at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:42)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
            at java.lang.Thread.run(Thread.java:745)
        Caused by: ; nested: NullPointerException;
            at org.elasticsearch.ElasticsearchException.guessRootCauses(ElasticsearchException.java:382)
        at org.elasticsearch.action.search.SearchPhaseExecutionException.guessRootCauses(SearchPhaseExecutionException.    java:152)
            at org.elasticsearch.action.search.SearchPhaseExecutionException.getCause(SearchPhaseExecutionException.java:99)
            at java.lang.Throwable.printStackTrace(Throwable.java:665)
            at java.lang.Throwable.printStackTrace(Throwable.java:721)
            at org.apache.log4j.DefaultThrowableRenderer.render(DefaultThrowableRenderer.java:60)
            at org.apache.log4j.spi.ThrowableInformation.getThrowableStrRep(ThrowableInformation.java:87)
            at org.apache.log4j.spi.LoggingEvent.getThrowableStrRep(LoggingEvent.java:413)
            at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:313)
            at org.apache.log4j.WriterAppender.append(WriterAppender.java:162)
            at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
            at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
            at org.apache.log4j.Category.callAppenders(Category.java:206)
            at org.apache.log4j.Category.forcedLog(Category.java:391)
            at org.apache.log4j.Category.log(Category.java:856)
            at org.elasticsearch.common.logging.log4j.Log4jESLogger.internalInfo(Log4jESLogger.java:125)
            at org.elasticsearch.common.logging.support.AbstractESLogger.info(AbstractESLogger.java:90)
            at org.elasticsearch.rest.BytesRestResponse.convert(BytesRestResponse.java:131)
            at org.elasticsearch.rest.BytesRestResponse.<init>(BytesRestResponse.java:96)
            at org.elasticsearch.rest.BytesRestResponse.<init>(BytesRestResponse.java:87)
            at org.elasticsearch.rest.action.support.RestActionListener.onFailure(RestActionListener.java:60)
    at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction.raiseEarlyFailure(        TransportSearchTypeAction.java:316)
            ... 10 more
        Caused by: java.lang.NullPointerException
            at org.elasticsearch.index.query.QueryParseContext.parseInnerQuery(QueryParseContext.java:258)
            at org.elasticsearch.index.query.BoolQueryParser.parse(BoolQueryParser.java:116)
            at org.elasticsearch.index.query.QueryParseContext.parseInnerQuery(QueryParseContext.java:257)
            at org.elasticsearch.index.query.IndexQueryParserService.innerParse(IndexQueryParserService.java:303)
            at org.elasticsearch.index.query.IndexQueryParserService.parse(IndexQueryParserService.java:206)
            at org.elasticsearch.index.query.IndexQueryParserService.parse(IndexQueryParserService.java:201)
            at org.elasticsearch.search.query.QueryParseElement.parse(QueryParseElement.java:33)
            at org.elasticsearch.search.SearchService.parseSource(SearchService.java:831)
            at org.elasticsearch.search.SearchService.createContext(SearchService.java:651)
            at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:617)
            at org.elasticsearch.search.SearchService.executeFetchPhase(SearchService.java:460)
    at org.elasticsearch.search.action.SearchServiceTransportAction$SearchQueryFetchTransportHandler.messageReceived(        SearchServiceTransportAction.java:392)
    at org.elasticsearch.search.action.SearchServiceTransportAction$SearchQueryFetchTransportHandler.messageReceived(        SearchServiceTransportAction.java:389)
            at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:350)
            at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
            ... 3 more
    

    有什么办法可以使这项工作吗?我在这上弄错了DSL吗?关于inner_hits的文档仅说明突出显示可以使用(https://www.elastic.co/guide/en/elasticsearch/reference/2.1/search-request-inner-hits.html),但没有任何细节。

    非常感谢您的阅读和任何提示!

    最佳答案

    一个很好的问题是,如果在查询上下文中使用内部匹配,则不支持高亮查询。不确定为什么这么大可能是一个错误。

    解决方法是将突出显示的嵌套查询包装在最终突出显示中
    查询。但是,这将需要原始的嵌套查询作为过滤器:
    OP中高亮显示的示例解决方法如下所示:

    put test/docs/1
    {
      "doctext": "I will do a presentation. I talk about lions and show images of zebras. I hope it will be fun.",
      "sentences": [
        {
          "text": "I will do a presentation."
        },
        {
          "text": "I talk about lions and show images of zebras."
        },
        {
          "text": "I hope it will be fun for lions"
        }
      ]
    }
    
    
    post test/_search
    {
       "query": {
          "bool": {
             "should": [
                {
                   "match": {
                      "doctext": "zebras"
                   }
                },
                {
                   "nested": {
                      "path": "sentences",
                      "query": {
                         "match": {
                            "sentences.text": "zebras"
                         }
                      },
                      "inner_hits": {
                         "highlight": {
                            "fields": {
                               "sentences.text": {}
                            }
                         }
                      }
                   }
                }
             ]
          }
       },
       "_source": false,
       "highlight": {
          "fields": {
             "*": {
                "highlight_query": {
                   "bool": {
                      "should": [
                         {
                            "match": {
                               "doctext": "lions"
                            }
                         },
                         {
                            "nested": {
                               "path": "sentences",
                               "query": {
                                  "filtered": {
                                     "query": {
                                        "match": {
                                           "sentences.text": "lions"
                                        }
                                     },
                                     "filter": {
                                        "query": {
                                           "match": {
                                              "sentences.text": "zebras"
                                           }
                                        }
                                     }
                                  }
                               },
                               "inner_hits": {
                                  "highlight": {
                                     "fields": {
                                        "sentences.text": {}
                                     }
                                  }
                               }
                            }
                         }
                      ]
                   }
                }
             }
          }
       }
    }
    

    结果:
    {
       "took": 1,
       "timed_out": false,
       "_shards": {
          "total": 1,
          "successful": 1,
          "failed": 0
       },
       "hits": {
          "total": 1,
          "max_score": 0.6360315,
          "hits": [
             {
                "_index": "test",
                "_type": "docs",
                "_id": "1",
                "_score": 0.6360315,
                "highlight": {
                   "doctext": [
                      "I will do a presentation. I talk about <em>lions</em> and show images of zebras. I hope it will be fun."
                   ]
                },
                "inner_hits": {
                   "sentences": {
                      "hits": {
                         "total": 1,
                         "max_score": 0.40240064,
                         "hits": [
                            {
                               "_index": "test",
                               "_type": "docs",
                               "_id": "1",
                               "_nested": {
                                  "field": "sentences",
                                  "offset": 1
                               },
                               "_score": 0.40240064,
                               "_source": {
                                  "text": "I talk about lions and show images of zebras."
                               },
                               "highlight": {
                                  "sentences.text": [
                                     "I talk about <em>lions</em> and show images of zebras."
                                  ]
                               }
                            }
                         ]
                      }
                   }
                }
             }
          ]
       }
    }
    

    08-07 18:35