copy_to和自定义分析器无法正常工作

时间:2015-05-25 07:26:42

标签: elasticsearch

(我正在使用Elasticsearch 1.5.2的新副本执行此操作)

我已经定义了一个自定义分析器并且它正在工作:

curl -XPUT 127.0.0.1:9200/test -d '{
  "settings": {
      "index": {
        "analysis": {
          "tokenizer": {
            "UrlTokenizer": {
              "type":    "pattern",
              "pattern": "https?://([^/]+)",
              "group":   1
            }
          },
          "analyzer": {
            "accesslogs": {
              "tokenizer": "UrlTokenizer"
            }
          }
        }
     }
  }
}'; echo

curl '127.0.0.1:9200/test/_analyze?analyzer=accesslogs&text=http://192.168.1.1/123?a=2#1111' | json_pp

现在我将它应用于索引:

curl -XPUT 127.0.0.1:9200/test/accesslogs/_mapping -d '{
  "accesslogs" : {
    "properties" : {
      "referer" : { "type" : "string", "copy_to" : "referer_domain" },
      "referer_domain": {
         "type":     "string",
         "analyzer": "accesslogs"
      }
    }
  }
}'; echo

从映射中我可以看到它们都被应用了。

现在我尝试插入一些数据,

curl 127.0.0.1:9200/test/accesslogs/ -d '{
    "referer": "http://192.168.1.1/aaa.php",
    "response": 100
}';echo

并且未生成copy_to字段,即referer_domain,如果我尝试添加具有该名称的字段,则也不会应用标记生成器。

有什么想法吗?

1 个答案:

答案 0 :(得分:9)

copy_to有效,但是,您假设由于您没有看到正在生成的字段,因此它不存在。

当您退回文档时(例如GET /test/accesslogs/1),您将看不到_source下的字段。其中包含已编制索引的原始文档。并且您没有为任何referer_domain字段编制索引,只有refererresponse。这就是你没有看到它的原因。

但Elasticsearch 确实在倒排索引中创建了该字段。如果存储它,您可以使用它来查询,计算或检索。

让我举例说明我的陈述:

  • 您可以查询该字段,然后您将根据它获得结果。如果您真的想查看倒排索引中存储的内容,可以执行以下操作:
GET /test/accesslogs/_search
{
  "fielddata_fields": ["referer","response","referer_domain"]
}
  • 如果你存储
  • ,你也可以检索该字段:
  "referer_domain": {
    "type": "string",
    "analyzer": "accesslogs",
    "store" : true
  }

用这个:

GET /test/accesslogs/_search
{
  "fields": ["referer","response","referer_domain"]
}

总之,copy_to修改了索引文档,而不是文档。您可以查询具有该字段的文档,它将起作用,因为查询会查看倒排索引。如果您想检索该字段,您还需要存储它。但是,您不会在_source字段中看到该字段,因为_source是已编入索引的初始文档。初始文档不包含referer_domain