【问题标题】:Search across _all field in Elastic and return results with highlighting在 Elastic 中的 _all 字段中搜索并返回结果并突出显示
【发布时间】:2017-12-22 19:53:36
【问题描述】:

我正在使用 Elastic 5.4,并希望跨包含多种类型文档的索引进行查询。(类型 a 和类型 b)。以下是索引中的示例文档:

文件:

{
  "_index": "test",
  "_type": "a",
  "_id": "1",
  "_source": {
    "id": "1",
    "name": "john-usa-soccer",
    "class": "5",
    "lastseen": "2017-07-05",
    "a_atts": {
      "lastname": "tover",
      "hobby": "soccer",
      "country": "usa"
    }
  }
}

 {
  "_index": "test",
  "_type": "b",
  "_id": "2",
  "_source": {
    "id": "2",
    "name": "john-usa",
    "class": "5",
    "lastseen": "2017-07-05",
    "b_atts": {
      "lastname": "kaml",
      "hobby": "baseball",
      "country": "usa"
    }
  }
}

映射:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_ngram_analyzer": {
          "tokenizer": "my_ngram_tokenizer"
        }
      },
      "tokenizer": {
        "my_ngram_tokenizer": {
          "type": "ngram",
          "min_gram": "3",
          "max_gram": "3",
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "a": {
      "dynamic_templates": [
        {
          "strings": {
            "match": "*",
            "match_mapping_type": "string",
            "mapping": {
              "type": "text",
              "analyzer": "my_ngram_analyzer",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                },
                "suggest": {
                  "type": "completion",
                  "analyzer": "simple"
                },
                "analyzer1": {
                  "type": "text",
                  "analyzer": "simple"
                },
                "analyzer2": {
                  "type": "text",
                  "analyzer": "standard"
                }
              }
            }
          }
        }
      ]
    },
    "b": {
      "dynamic_templates": [
        {
          "strings": {
            "match": "*",
            "match_mapping_type": "string",
            "mapping": {
              "type": "text",
              "analyzer": "my_ngram_analyzer",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                },
                "suggest": {
                  "type": "completion",
                  "analyzer": "simple"
                },
                "analyzer1": {
                  "type": "text",
                  "analyzer": "simple"
                },
                "analyzer2": {
                  "type": "text",
                  "analyzer": "standard"
                }
              }
            }
          }
        }
      ]
    }
  }
}

我的查询是在任何类型的任何字段中搜索包含“john”的所有文档,并突出显示找到匹配项的字段。这个查询是按照Elastic documentation 构造的。我的模式映射已将 ngram_analyzer 配置为分析器,而不是模式中所有字符串类型字段的默认分析器。

查询: http://localhost:9200/student/_search

{
  "query": {
    "bool": {
      "should": [
        { "match": { "_all": "john"} }
      ]
    }
  },
  "highlight": {
    "fields": {
      "name": { 
        "require_field_match": false
      },
      "a_atts.lastname":{
        "require_field_match": false
      },
      "a_atts.hobby":{
        "require_field_match": false
      },
      "a_atts.country":{
        "require_field_match": false
      }
    }
  }
}

回应:

{
  "took": 79,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.17669111,
    "hits": [
      {
        "_index": "student",
        "_type": "a",
        "_id": "AV1WjBeYEZrDBYsdGMtY",
        "_score": 0.17669111,
        "_source": {
          "name": "john-usa-soccer",
          "class": "5",
          "lastseen": "2017-07-05",
          "a_atts": {
            "lastname": "tover",
            "hobby": "soccer",
            "country": "usa"
          }
        }
      },
      {
        "_index": "student",
        "_type": "b",
        "_id": "AV1WjHFxEZrDBYsdGMtZ",
        "_score": 0.17669111,
        "_source": {
          "name": "john-usa",
          "class": "5",
          "lastseen": "2017-07-05",
          "b_atts": {
            "lastname": "kaml",
            "hobby": "baseball",
            "country": "usa"
          }
        }
      }
    ]
  }
}

但是,对索引执行上述查询时,会返回与其 _source 内容匹配的文档,但不会返回高亮字段。它缺少以下内容:

    "highlight": {
      "name": [
        "<em>john</em>-usa-soccer"
      ]
    }

如何在结果中返回高亮显示?

【问题讨论】:

  • 您能否显示您对查询和架构映射的响应
  • @user3775217 我已经用映射和查询响应更新了查询

标签: elasticsearch indexing lucene full-text-search


【解决方案1】:

按照this 链接中提供的答案,我可以使用荧光笔。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 2019-07-25
    • 2012-02-16
    • 2015-09-09
    • 2014-07-25
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多