ElasticSearch可以将一个字段拼接在一起以显示来自字段不同部分的匹配吗?

时间:2015-08-07 20:31:18

标签: elasticsearch highlighting

在长字段上执行查询时,即。 Description,字段本身可能是200天或更长的字符。

要显示搜索结果中的相关性,ES可以将字段的不同部分拼接在一起以显示此内容吗?

例如:

  

有一辆红色的汽车,有四扇门沿着砖路行驶......另一个红色的气球漂浮着。

如果查询搜索“红色”,有没有办法显示如下内容:

  

有一扇带有四扇门的[em]红色[/ em]车。 。 。而另一个[em]红色[/ em]气球漂浮着。

我意识到我们可以使用highlight来将匹配的关键字片段包装在重点标签中。

我想知道ES是否可以将匹配关键字片段周围的相关字段片段拼接在一起。

1 个答案:

答案 0 :(得分:2)

是的,您正走在正确的道路上,这正是highlighting的用途。让我们试试你的例子。

首先,让我们创建一个索引highlights,其映射类型包含一个名为content的字符串字段。对于此示例,我们使用fast vector highlighter,它可以完成我们想要显示的内容。

curl -XPUT localhost:9200/highlights -d '{
  "mappings": {
    "highlight": {
      "properties": {
        "content": {
          "type": "string",
          "term_vector": "with_positions_offsets"
        }
      }
    }
  }
}'

然后我们使用您建议的内容索引新文档:

curl -XPUT localhost:9200/highlights/highlight/1 -d '{
    "content": "There was a red car with four doors driving down the brick road bla bla bla bla bla bla bla bla bla bla bla bla and another red balloon was floating."
}'

现在我们可以查询并突出显示red一词,如下所示:

curl -XPOST localhost:9200/highlights/highlight/_search -d '{
  "_source": false,
  "query": {
    "match": {
      "content": "red"
    }
  },
  "highlight": {
    "fields": {
      "content": {
        "fragment_size": 30
      }
    }
  }
}'

这会产生以下结果:

{
  ...
  "hits" : {
    "total" : 1,
    "max_score" : 0.06780553,
    "hits" : [ {
      "_index" : "highlights",
      "_type" : "highlight",
      "_id" : "1",
      "_score" : 0.06780553,
      "highlight" : {
        "content" : [ 
          "There was a <em>red</em> car with four doors", 
          "bla and another <em>red</em> balloon was floating" 
        ]
      }
    } ]
  }
}

另请注意,如果需要,标签可以customized and changed为您的喜好。