我是 Elasticsearch 的新手,我一直在尝试掌握它的工作原理,但不幸的是,到目前为止,它并没有找到明确的教程。
我一直试图实现的是索引一些数据并对它们执行过滤。
我通过将数据作为JSON传递并通过HttpWebRequest发送来为数据建立索引。样本数据如下
{"changeset":"2015-12-01 12:06+05:30","id":"1","registerid":"1"}
现在让我感到困惑的是每个文档字段的数据类型。正如一些数据一样,另一个字符串和另一个int。因此,当我过滤数据时,说我想获取所有变更集日期大于2015-01-01(yyyy-mm-dd)的索引,或者我想获取所有registerid小于100的索引。
由于所有数据均以JSON格式保存,因此我们该如何处理它。
然后,在反复搜索(google)之后,我发现了一个名为“mapping” Ref Link的概念。
那么,是否必须使用映射创建索引来实现过滤功能?
最佳答案
Mapping types确实是要走的路。映射类型允许您定义文档中具有哪些字段以及它们具有什么类型。如果您不提供映射类型,Elasticsearch将尽力推断您的字段及其类型,但是您可能会以其猜测不准确的情况而告终。
常见的最佳做法是始终提供自己的自定义映射,以便您可以确保如何处理数据。
对于上面的示例数据,您可以通过使用 date
field,字符串字段和int字段指定映射类型来简单地创建索引:
curl -XPUT localhost:9200/your_index -d '{
"mappings": {
"your_type": {
"properties": {
"changeset": {
"type": "date",
"format": "yyyy-MM-dd HH:mmZ"
},
"id": {
"type": "string"
},
"registerid": {
"type": "integer"
},
}
}
}
}'
有了指定的映射类型,Elasticsearch现在将知道如何解释JSON文档中存在的字符串数据。完成此操作后,现在可以轻松创建查询,例如您已表达的两个查询,即:
所有
changeset
日期大于2015-01-01的文档都可以这样查询:curl -XPOST localhost:9200/your_index/_your_type/_search -d '{
"query": {
"filtered": {
"filter": {
"range": {
"changeset": {
"gt": "2015-01-01"
}
}
}
}
}
}'
所有
registerid
日期小于100的文档都可以这样查询:curl -XPOST localhost:9200/your_index/_your_type/_search -d '{
"query": {
"filtered": {
"filter": {
"range": {
"registerid": {
"lt": 100
}
}
}
}
}
}'
关于c# - 在Elasticsearch中执行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34389444/