当前位置:  开发笔记 > 编程语言 > 正文

ElasticSearch:inner_hits和hightlight_query

如何解决《ElasticSearch:inner_hits和hightlight_query》经验,为你挑选了1个好方法。

简短版本:是否有可能获得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_query部分第二 highlight,而不是一个在inner_hits

发出此查询将导致此响应:

"hits": [
      {
        "_index": "documents",
        "_type": "docs",
        "_id": "123456",
        "_score": 0.6360315,
        "highlight": {
          "doctext": [
            "I will do a presentation. I talk about lions 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 zebras."
                    ]
                  }
                }
              ]
            }
          }
        }
      }
    ]

请注意doctext,虽然我们搜索了斑马,但是对于野外,狮子会突出显示.该做突出那些因为我们没有指定其他事情做.但是我想要突出内部命中来突出狮子,就像突出显示一样.inner_hitsdoctext

我试图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.(BytesRestResponse.java:96)
        at org.elasticsearch.rest.BytesRestResponse.(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),但不会涉及任何细节.

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



1> keety..:

一个好的问题看起来像在查询上下文中的内部命中不支持突出显示查询.不确定为什么这很可能是一个错误.

解决方法是将突出显示的嵌套查询包装在最终突出显示查询中.但是,它需要原始的嵌套查询作为过滤器: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 lions 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 lions and show images of zebras."
                              ]
                           }
                        }
                     ]
                  }
               }
            }
         }
      ]
   }
}

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有