如何存储分析器生成的内容?

How to store what is generated by the analyser?

假设我使用这个映射:

PUT test
{
  "settings" : {
    "index" : {
        "number_of_shards" : 1, 
        "number_of_replicas" : 0
    }
  },
  "mappings": {
    "testtype": {
      "properties": {
        "content": {
          "type":     "text",
          "analyzer": "english",
          "store": true
        }
      }
    }
  }
}

现在我可以索引文档了:

PUT test/testtype/0
{
   "content": "The Quick Brown Box"
}

而且我可以取回它:

GET test/testtype/0

哪个 return 我:

{
  "_index": "test",
  "_type": "testtype",
  "_id": "0",
  "_version": 1,
  "found": true,
  "_source": {
    "content": "The Quick brown Fox"
  }
}

我知道在源字段中您应该只有插入的文档,这就是为什么我在映射中指定要存储内容字段的原因。因此,通过查询我的商店字段,我希望其中包含分析器生成的内容,如下所示:

"quick brown fox"

但是当我查询存储字段时:

GET test/testtype/_search
{
  "stored_fields": "content" 
}

我在文档中写的完全一样:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "test",
        "_type": "testtype",
        "_id": "0",
        "_score": 1,
        "fields": {
          "content": [
            "The Quick brown Fox"
          ]
        }
      }
    ]
  }
}

所以我的问题是如何将分析器生成的结果存储在我的 elasticsearch 中?

您可以设置索引或查询时间分析器。如果您使用的是索引时间分析器,那么分析的文本将被存储。

更多详情:https://www.elastic.co/guide/en/elasticsearch/reference/current/analyzer.html

另一种方法是使用多字段。这意味着您拥有原始文本和处理后的文本。

更多详情:https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html

您的问题是关于存储的文本和生成的标记之间的区别: the store attribute of a lucene field

存储的字段包含与“_source”中相应字段完全相同的内容-JSON。

生成的令牌在 lucene 内部表示中。但是您可以使用 _analyze or _termvectors 端点来查看令牌 或者您可以使用 term-aggregation