根据ealsticsearch中的分析输出创建自定义字段

时间:2017-10-12 14:01:57

标签: elasticsearch

我有文件,其中value是原始字符串: {"内容" :" field1 = 1,field2 = foo"}

我的意图是,通过field1,field2值查询。

我能想到的最近的事情是使用自定义分析器,它将基于逗号分隔符创建令牌,然后我可以搜索匹配的精确值,如" field1 = 1"或" field2 = foo" 。但是,理想情况下,我喜欢搜索field1的范围值,field2等的模式匹配。

有没有办法实现这个目标?我找不到任何方法来存储我可以用这种方式查询的分析结果。

2 个答案:

答案 0 :(得分:0)

你是如何摄取文件的?如果您通过logstash进行操作,则可以使用过滤器处理器在那里应用转换

答案 1 :(得分:0)

我对你的问题有点困难。但是,我想你问是否有办法让Field1数字的类型和Field2的类型可搜索?

希望您正在运行Kibana,以便您可以使用Dev控制台对其进行测试。如果您只是让Elastic导入数据,它将为field1和field2创建可聚合和可搜索的字段,因为它们都设置为字符串值:

PUT /content_default/type/1 {"field1":"1" , "field2":"foo"}

如果您改为忽略1周围的引号,Elastic将创建该字段为long(假设您尚未导入同一字段中包含字符串的文档) - 这允许您按范围搜索。在这里我创建一个新的field3并将值设置为1,如果你查询你应该看到它很长

PUT /content_default/type/2 {"field1":"1" , "field2":"foo", "field3":1}

您可以预先加载模板,以便在加载任何数据之前预先定义类型 - 这样Elastic不必猜测您的字段应该是什么类型。使用字符串,您还可以定义是否希望它们只是关键字,可搜索或两者兼而有之。

这样的事情可以帮到你:

PUT _template\with_template 
{  
   "template":"content_with_template",
   "mappings":{  
      "content_with_template":{  
         "properties":{  
            "field2":{  
               "analyzer":"simple",
               "type":"text"
            },
            "field1":{  
               "type":"keyword"
            },
            "field3":{  
               "type":"long"
            }
         }
      }
   }
}

然后将文档放入新的'content_with_template'索引中,此时无论field3是否在引号中都没关系 - 只要它解析为一个数字就会保存

PUT /content_with_template/type/1 
{ "field1":"a1d" , "field2":"foo", "field3":1}

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.html