在_all字段上突出显示匹配的结果

时间:2011-11-27 14:52:14

标签: lucene elasticsearch

我希望突出显示匹配的结果。如果我提到字段名称并且它返回突出显示的文本,这对我有用,但是如果我将字段指定为“_all”,则它不返回任何值。 这对我有用:

        curl -XGET "http://localhost:9200/my_index/my_type/_search?q=stackoverflow&size=999" -d '{
        "highlight":{
                    "fields":{
                             "my_field":{}
                    }
        }
}'

返回预期值,如下所示: [highlight] => stdClass对象([my_field] =>数组([0] => stackoverflow 是技术人员的最佳网站))

但是当我这样说时:

        curl -XGET "http://localhost:9200/my_index/my_type/_search?q=stackoverflow&size=999" -d '{
        "highlight":{
                    "fields":{
                             "_all":{}
                    }
        }
}'

我得到空值/没有结果。

[highlight] => stdClass Object ( [_all] => Array () )

如何让它在任何字段上工作,以便我不必提及字段名称?

4 个答案:

答案 0 :(得分:27)

避免在索引中添加_all作为存储字段

另一种快速解决方法:使用*代替_all

curl -XGET "http://localhost:9200/my_index/my_type/_search?q=stackoverflow&size=999" -d '{
  "highlight":{
    "fields":{
      "*":{}
    }
  }
}'

答案 1 :(得分:16)

如果您使用的是ES 2.x,那么由于changes made,您需要将require_field_match选项设置为false,来自文档

  

require_field_match选项的默认值已从false更改为true,这意味着默认情况下,荧光笔只会将查询的字段考虑在内。

     

这意味着,在查询_all字段时,尝试突出显示   除_all之外的任何字段都不会产生突出显示的片段。

"highlight": {
    "fields": {
      "*": {}
    },
    "require_field_match": false
 }

答案 2 :(得分:5)

您需要将_all字段映射为已存储。下面的映射应该可以解决问题。请注意,这将添加到索引大小。

{
  "my_type": {
      "_all": {
        "enabled": true,
        "store": "yes"
      }
  }}

答案 3 :(得分:-1)

此库具有查询突出显示功能,包括突出显示所有字段。 README解释了如何使用_all字段存储等创建弹性搜索索引: https://github.com/niranjan-uma-shankar/Elasticsearch-PHP-class