我以为我已经找到了Elasticsearch,但我怀疑我没有找到一些东西,因此这个问题:
我正在为具有大量字段的产品编制索引,但有问题的产品是:
{
"show_in_catalogue": {
"type": "boolean",
"index": "no"
},
"prices": {
"type": "object",
"dynamic": false,
"properties": {
"site_id": {
"type": "integer",
"index": "no"
},
"currency": {
"type": "string",
"index": "not_analyzed"
},
"value": {
"type": "float"
},
"gross_tax": {
"type": "integer",
"index": "no"
}
}
}
}
我正在尝试返回“show_in_catalogue”为真的所有文档,并且site_id为1的价格:
{
"filter": {
"term": {
"prices.site_id": "1",
"show_in_catalogue": true
}
},
"query": {
"match_all": {}
}
}
这会返回零结果。我还尝试了一个带有两个单独术语的“和”过滤器 - 没有运气。
如果我没有过滤器,则返回其中一个文档的子集:
{
"prices": [
{
"site_id": 1,
"currency": "GBP",
"value": 595,
"gross_tax": 1
},
{
"site_id": 2,
"currency": "USD",
"value": 745,
"gross_tax": 0
}
]
}
我希望我可以在这里省略这么多文件;我不相信它是偶然的,但我当然不能肯定。
我是否错过了一项至关重要的知识,或者我做过一些最终的事情?无论哪种方式,我都会感谢专家在这一点上的知识。谢谢!
修改:
根据J.T.的建议我还尝试重新索引文档,以便prices.site_id
被编入索引 - 没有变化。还试过下面的bool / must过滤器无济于事。
为了澄清,我使用空查询的原因是Web界面可能提供查询字符串,但使用相同的代码来简单地过滤所有产品。因此我离开了查询,但是空了,因为这就是Elastica似乎没有查询字符串的情况。
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [
{
"term": {
"show_in_catalogue": true
}
},
{
"term": {
"prices.site_id": 1
}
}
]
}
}
}
}
}
答案 0 :(得分:2)
您将site_id设置为{“index”:“no”}。这告诉ElasticSearch从索引中排除该字段,这使得无法在该字段上查询或过滤。数据仍将存储。同样,您可以将字段设置为仅在索引中并可搜索,但不能存储。
我也是ElasticSearch的新手,并不能总是提出问题!我真的很困惑你的查询。如果您要“只过滤”,那么您不需要查询。我不明白的是你在术语过滤器中使用了两个字段。我从来没有这样做过。我猜它是一个OR吗?此外,如果没有匹配,它似乎返回一切。如果您希望查询过滤该查询的结果,那么您可能希望使用
-d '{
"query": {
"filtered": {
"query": {},
"filter": {}
}
}
}'
如果您只想应用过滤器,那么过滤器应该可以在没有任何“查询”的情况下工作
-d '{
"filter": {
"bool": {
"must": [
{
"term": {
"show_in_catalogue": true
}
},
{
"term": {
"prices.site_id": 1
}
}
]
}
}
}'