从字段中提取关键字

时间:2018-04-19 08:54:07

标签: elasticsearch elasticsearch-analyzers

我想写一个查询来分析一个或多个字段?

即。当前的分析器需要文本才能运行,而不是传递我希望传递字段值的文本。

如果我有这样的文件

{
    "desc": "A document description",
    "name": "This name is not original",
    "amount": 3000
}

我想返回类似下面的内容

{
    "desc": ["document", "description"],
    "name": ["name", "original"],
    "amount": 3000
}

2 个答案:

答案 0 :(得分:2)

您可以使用术语向量或多项向量来实现您的目标:

  

https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-multi-termvectors.html

您必须指定所需字段的 ID 以及字段,并且它将为您拥有的每个文档返回分析的标记数组以及您提供的某些其他信息很容易禁用。

GET /exampleindex/_doc/_mtermvectors
{
  "ids": [
    "1","2"
  ],
  "parameters": {
    "fields": [
      "*"
    ]
  }
}

将返回以下内容:

"docs": [
    {
      "_index": "exampleindex",
      "_type": "_doc",
      "_id": "1",
      "_version": 2,
      "found": true,
      "took": 0,
      "term_vectors": {
        "desc": {
          "field_statistics": {
            "sum_doc_freq": 5,
            "doc_count": 2,
            "sum_ttf": 5
          },
          "terms": {
            "amazing": {
              "term_freq": 1,
              "tokens": [
                {
                  "position": 1,
                  "start_offset": 3,
                  "end_offset": 10
                }
              ]
            },
            "an": {
              "term_freq": 1,
              "tokens": [
                {
                  "position": 0,
                  "start_offset": 0,
                  "end_offset": 2
                }
              ]
            }

答案 1 :(得分:0)

好吧,这是一个不同的场景。要在字段上使用分析器,您必须在映射中声明它,如您在doc中所见。但是,如果将分析器与映射中的字段相关联,则将分析所有字段值。 Analyzer会改变文本在lucene的倒排索引中的索引方式 - 因此只能检索它 - 而不是值的内容。因此,您可以分析字段并仅在需要时调用_analyze api。如果您希望在某些条件下以不同的方式检索文本,则场景会再次更改。根据我的说法,最后一种方案的更快更简单的解决方案是复制你的字段,一次使用分析仪,第二种不用