下面嵌套的ElasticSearch查询返回一些不应该命中的结果。许多结果不包含请求的订单号,但仍然列出了。我没有得到所有的文档,所以查询肯定会在某种程度上减少结果集。
{
"query": {
"nested": {
"path": "orders",
"query": {
"match": {
"orderNumber": "242347"
}
}
}
}
}
查询结果(截断):
{
"took":0,
"timed_out":false,
"_shards": {
"total":1,
"successful":1,
"failed":0
},
"hits": {
"total":60,
"max_score":9.656103,
"hits":[
{
"_index": "index1",
"_type":"documenttype1",
"_id":"mUmudQrVSC6rn68ujDJ8iA",
"_score":9.656103,
"_source" : {
"documentId": 12093894,
"orders": [
{
"customerId": 129048669,
"orderNumber": "242347", // <-- CORRECT HIT ON ORDER
},
{
"customerId": 229405848,
"orderNumber": "431962"
}
]
}
},
{
"_index":"index1",
"_type":"documenttype1",
"_id":"9iO5QBCpT_6kmH3CoBTdWw",
"_score":9.656103,
"_source" : {
"documentId": 43390283,
// <-- ORDER ISN'T HERE BUT THE DOCUMENT IS HIT NEVERTHELESS!
"orders": [
{
"customerId": 229405848,
"orderNumber": "431962"
},
{
"customerId": 129408979,
"orderNumber": "142701"
}
]
}
}
// Left out 58 more results most of which do not contain
// the requested order number.
]
}
}
正如您所看到的,有一个点击(实际上,有相当多的点击)不应该出现,因为没有一个订单包含请求的订单号。
这是文档类型1
的映射:
{
"index1":{
"properties":{
"documentId":{
"type":"integer"
},
"orders":{
"type":"nested",
"properties":{
"customerId":{
"type":"integer"
},
"orderNumber":{
"type":"string",
"analyzer":"custom_internal_code"
}
}
}
}
}
}
最后,以下是澄清上述映射中所述的自定义\u内部\u代码
分析器的设置:
{
"index1":{
"settings":{
"index.analysis.analyzer.custom_internal_code.filter.1":"asciifolding",
"index.analysis.analyzer.custom_internal_code.type":"custom",
"index.analysis.analyzer.custom_internal_code.filter.0":"lowercase",
"index.analysis.analyzer.custom_internal_code.tokenizer":"keyword",
}
}
}
似乎应该使用布尔查询而不是匹配。
但是如果只想筛选记录,则应该使用嵌套筛选而不是查询。它工作得更快,因为你不必计算分数。
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-nested-filter.html
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"nested": {
"path": "orders",
"filter": {
"bool": {
"must": [
{
"term": {
"orderNumber": "242347"
}
}
]
}
},
"_cache": true
}
}
}
}
}
对于一个精确的搜索使用termQuery[1]和orderNumbernot_analyzed[2]。
[1]http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-term-query.html#query-dsl-term-query
[2] http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/mapping-intro.html#_literal_index_literal
我试图创建一个嵌套查询,它将过滤掉一些带有特定术语的文档。在本例中,我试图过滤掉在user.first中有匹配术语的文档。数据示例: 我的查询没有得到所需的结果,因为它返回给我所有未筛选的记录。我尝试使用: 我希望这里得到与过滤器不匹配的文档。在这种情况下,它应该只返回第二个文档。做这件事的正确方法是什么?
问题内容: 我在获取与Elasticsearch一起使用的嵌套查询时遇到问题(如果我删除了查询字符串之一,则可以使用)。我要解决的问题是我有一个包含关闭列表的文档(关闭)。我想在条件满足另一个值的闭包列表中搜索一个值。那只是从argan = 1的闭包中获得价值 我正在得到这个错误响应; 我的映射如下所示。 有人知道我在做什么错吗? 问题答案: 您的查询不是有效的查询。您需要使用适当的复合查询将其他
问题内容: 我正在尝试使用query_string编写查询以检索嵌套对象的数据查询。 我想做的查询的一个例子是: 其中“ a”是嵌套对象,“ id”是“ a”的字段。 我知道我可以使用嵌套查询成功地执行此任务,编写如下查询: 但是,我想避免这种情况。我不想自己弄清楚用户正在搜索嵌套字段并修改查询。我尝试使用“ fields”参数,但它似乎不适用于嵌套对象。 是否可以使用“ query_string
问题内容: 我安装了16gb内存的Elasticsearch。我开始使用聚合,但是在尝试发出以下查询时遇到“ java.lang.OutOfMemoryError:Java堆空间”错误: query_string本身仅返回1266次匹配,因此OOM错误让我有些困惑。 我是否正确使用了聚合?如果没有,我该怎么做才能解决此问题?谢谢! 问题答案: 您正在将整个-,-和- 字段加载到内存中以进行汇总。这
问题内容: 我想使用ES进行图书搜索。因此,我决定将作者姓名和标题(作为嵌套文档)放入索引,如下所示: 我不明白的是:如何构造搜索查询,以便在搜索“一二”时仅找到第二本书,而在搜索“二三”时什么也找不到,而在搜索“一”时所有图书呢? 问题答案: 也许是这样的? 该查询基本上说一个文件必须有and 。您可以轻松地重新配置该查询。例如,如果您只想搜索作者,请删除嵌套部分。如果您想要另一本书,请更改嵌套
我有多个嵌套文档doc。嵌套查询工作正常,但它们仍然会返回所有嵌套对象(即整个文档),即使搜索查询只匹配少数嵌套对象。但是,它确实将文档作为一个整体进行过滤。 下面是一个例子: 当在地址中搜索时,理想情况下,我应该只获得带有一个嵌套对象的,但我会获得所有嵌套对象。如何筛选返回的嵌套对象? 示例查询: 该查询的输出是和所有员工,而我只想要。