ElasticSearch突出显示不突出显示

时间:2016-08-31 21:00:44

标签: elasticsearch

我很难理解如何突出工作。 我的查询正在返回该项目,但我没有看到会导致突出显示的标记。

以下是测试索引的设置:

curl -XPUT 'http://localhost:9200/testfoo' -d '{
    "mappings": {
        "entry": {
            "properties": {
                "id": { "type": "integer" },
                "owner": { "type": "string" },
                "target": {
                    "properties": {
                        "id": { "type": "integer" },
                        "type": {
                            "type": "string",
                            "index": "not_analyzed"
                        }
                    }
                },
                "body": { "type": "string" },
                "body_plain": { "type": "string"}
            }
        }
    }
}'

以下是几个插入的文档:

curl -XPUT 'http://localhost:9200/testfoo/entry/1' -d'{
    "id": 1,
    "owner": "me",
    "target": {
        "type": "event",
        "id":   100
    },
    "body": "<div>Message One has foobar in it</div>",
    "body_plain": "Message One has foobar in it"
}'

curl -XPUT 'http://localhost:9200/testfoo/entry/2' -d'{
    "id": 2,
    "owner": "me",
    "target": {
        "type": "event",
        "id":   200
    },
    "body": "<div>Message One has no bar in it</div>",
    "body_plain": "Message One has no bar in it"
}'

简单搜索返回预期文档:

curl -XPOST 'http://localhost:9200/testfoo/_search?pretty' -d '{
    "query": {
        "simple_query_string": {
            "query": "foobar"
        }
    }
}'
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.09492774,
    "hits" : [ {
      "_index" : "testfoo",
      "_type" : "entry",
      "_id" : "1",
      "_score" : 0.09492774,
      "_source" : {
        "id" : 1,
        "owner" : "me",
        "target" : {
          "type" : "event",
          "id" : 100
        },
        "body" : "<div>Message One has foobar in it</div>",
        "body_plain" : "Message One has foobar in it"
      }
    } ]
  }
}

然而,当我添加“突出显示”时,我得到相同的JSON,但body_plain没有“突出显示”匹配的术语:

curl -XPOST 'http://localhost:9200/testfoo/_search?pretty' -d '{
    "query":{
            "query": {
                "simple_query_string":{
                    "query":"foobar"
                }
            }
    },
    "highlight": {
        "pre_tags": [ "<div class=\"highlight\">" ],
        "post_tags": [ "</div>" ],
        "fields": {
            "_all": {
                "fragment_size": 10,
                "number_of_fragments": 1
            }
        }
    },
    "sort": [
        "_score"
    ],
    "_source": [ "target", "id", "body_plain", "body" ],
    "min_score": 0.9,
    "size":10
}'
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "testfoo",
      "_type" : "entry",
      "_id" : "1",
      "_score" : 1.0,
      "_source" : {
        "id" : 1,
        "body" : "<div>Message One has foobar in it</div>",
        "target" : {
          "id" : 100,
          "type" : "event"
        },
        "body_plain" : "Message One has foobar in it"
      }
    } ]
  }
}

我期待body_plain看起来像

  Message One has <div class="highlight">foobar</div> in it

想知道我做错了什么。感谢。

1 个答案:

答案 0 :(得分:3)

来自official documentation

  

为了执行突出显示,该字段的实际内容为   需要。如果存储了相关字段(将商店设置为true)   它将被使用,否则,实际的_source将被使用   已加载,相关字段将从中提取。

     

无法从_source中提取_all字段,因此它只能是   用于突出显示是否映射为将store设置为true。

您有两种方法可以解决这个问题。您可以更改映射以存储_all字段:

{
  "mappings": {
    "entry": {
      "_all": {              <-- add this
        "store": true
      },
      "properties": {
        ...

或者您将查询更改为:

curl -XPOST 'http://localhost:9200/testfoo/_search?pretty' -d '{
    "query":{
            "query": {
                "simple_query_string":{
                    "query":"foobar"
                }
            }
    },
    "highlight": {
        "pre_tags": [ "<div class=\"highlight\">" ],
        "post_tags": [ "</div>" ],
        "require_field_match": false,             <-- add this
        "fields": {
            "*": {                                <-- use this                  
                "fragment_size": 10,
                "number_of_fragments": 1
            }
        }
    },
    "sort": [
        "_score"
    ],
    "_source": [ "target", "id", "body_plain", "body" ],
    "min_score": 0.9,
    "size":10
}'