(我正在使用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
,如果我尝试添加具有该名称的字段,则也不会应用标记生成器。
有什么想法吗?
答案 0 :(得分:9)
copy_to
有效,但是,您假设由于您没有看到正在生成的字段,因此它不存在。
当您退回文档时(例如GET /test/accesslogs/1
),您将看不到_source
下的字段。其中包含已编制索引的原始文档。并且您没有为任何referer_domain
字段编制索引,只有referer
和response
。这就是你没有看到它的原因。
但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
。