当在查询中添加术语而不是过滤器时,我得到0个方面。仅供参考,我在Ruby中使用轮胎宝石。
这是我的模型代码及其映射:
class Property < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
has_and_belongs_to_many :tags
mapping do
indexes :id, type: 'integer'
indexes :status
indexes :refno, type: 'integer'
indexes :name, :analyzer => 'snowball', :boost => 100
indexes :description
indexes :tags, type: 'object',
properties: {
name: { type: 'multi_field',
fields: {
name: { type: 'string', analyzer: 'snowball' },
exact: { type: 'string', index: 'not_analyzed' }
}
}
}
end
def to_indexed_json
to_json( include: {
tags: { only: [:name] },
})
end
然后这是搜索方法
def self.search(params={})
tire.search(page: params[:page], per_page: 2, load: true) do
query do
boolean do
must { string params[:name], default_operator: "AND" } if params[:name].present?
must { term :status, 'live' }
must { term :refno, params[:refno]} if params[:refno].present?
# must { term :tag, params[:tag]} if params[:tag].present? ## does not work either
must { term 'tags.name.exact', params[:tag]} if params[:tag].present?
end
end
facet "tags" do
terms 'tags.name.exact'
end
raise to_json
# raise to_curl
end
end
我得到0个构面。 但是,如果我将构面移到过滤器(即下方),则会得到完整的构面。
def self.search(params={})
tire.search(page: params[:page], per_page: 2, load: true) do
query do
boolean do
must { string params[:name], default_operator: "AND" } if params[:name].present?
must { term :status, 'live' }
must { term :refno, params[:refno]} if params[:refno].present?
end
end
filter :term, 'tags.name.exact' => params[:tag] if params[:tag].present?
facet "tags" do
terms 'tags.name.exact'
end
raise to_json
# raise to_curl
end
end
没关系,这是不需要的,当单击构面过滤器时,我想从构面过滤器中删除不可用的标签并更新新的构面计数。
如果有帮助,这里是查询的json,它可以工作,而不能。
## No Factes
{
"query":{
"bool":{
"must":[
{
"query_string":{
"query":"England",
"default_operator":"AND"
}
},
{
"term":{
"status":"live"
}
},
{
"term":{
"tags.name.exact":[
"Pet Friendly"
]
}
}
]
}
},
"facets":{
"tags":{
"terms":{
"field":"tags.name.exact",
"size":10,
"all_terms":false
}
}
},
"size":2
}
## Facets working
{
"query":{
"bool":{
"must":[
{
"query_string":{
"query":"England",
"default_operator":"AND"
}
},
{
"term":{
"status":"live"
}
}
]
}
},
"facets":{
"tags":{
"terms":{
"field":"tags.name.exact",
"size":10,
"all_terms":false
}
}
},
"filter":{
"term":{
"tags.name.exact":[
"Pet Friendly"
]
}
},
"size":2
}
真希望有人能提供建议。开始把我的头发拉出来。
我实际上非常接近。由于我的标签可以有多个,因此我需要使用术语而不是术语,即
def self.search(params={})
tire.search(page: params[:page], per_page: 2, load: true) do
query do
boolean do
must { string params[:name], default_operator: "AND" } if
must { term :status, 'live' }
must { term :refno, params[:refno]} if params[:refno].present?
must { terms 'tags.name.exact', params[:tag]} if params[:tag].present?
end
end
facet "tags" do
terms 'tags.name.exact'
end
# raise to_json
# raise to_curl
end
end
感谢您的建议,尽管imotov,Hoang。
这是我得到的响应输出- 2018-11-20 18:25:34+0530:>{“查询”:{“布尔”:{“必须”:[{“匹配”:{“状态”:“活动”}},{“匹配”:{“is_published”:true}},{“匹配”:{“payed”:true}},{“match”:{“adverse_type”:“sell”}}]}},“排序”:[{“updated_at”:{“order”:“desc”}
现在有三台ES服务器,索引里大概有7000条数据,每条数据是内容放到txt中大概300kb以上,按某个查询条件查询的结果数量是4000多条数据。当size设置成9999的时候,需要查询30秒以上,这是为什么呢,有没有优化方案。
问题内容: 我试图查询elasticsearch以便找出使用某种产品购买了哪些产品。 我的数据从平面文件进入logstash。 如您在上面看到的,我有一个 鸡肉* 的 产品名称 ,它以不同的 订单号出现 。 *** 这就是我想要实现的目标: 步骤1:查找所有包含鸡肉的订单号 第2步:如果上述订单中有鸡肉,请给我购买的所有其他产品 结果: 到目前为止,这是我为 Step1 所做的尝试: 询问 结果
问题内容: 我正在尝试模仿我在C#中使用NEST在Sense(chrome插件)中编写的查询。我不知道这两个查询之间的区别是什么。Sense查询返回记录,而nest查询则不。查询如下: 和 这两个查询有什么区别?为什么一个返回记录而另一个不返回? 问题答案: 您可以通过以下代码找出NEST使用的查询: 然后,您可以比较输出。
主要内容:匹配所有查询,全文查询,匹配查询,multi_match查询,查询字符串查询,期限等级查询,范围查询,复合查询,连接查询,地理查询在Elasticsearch中,通过使用基于JSON的查询进行搜索。 查询由两个子句组成 - 叶查询子句 - 这些子句是匹配,项或范围的,它们在特定字段中查找特定值。 复合查询子句 - 这些查询是叶查询子句和其他复合查询的组合,用于提取所需的信息。 Elasticsearch支持大量查询。 查询从查询关键字开始,然后以对象的形式在其中包含条件和过滤器。以下描
问题内容: 我正在存储看起来像这样的文档: 然后,我用各种侧边栏过滤器显示这些列表,这些过滤器用于分类和日期(按年,按月)。根据用户选择的选项,结果查询可能最终看起来像: 这似乎完全按预期工作,除了当我尝试添加构面时,我可以在日期等旁边加上小数字(1)等: 仅当我不在查询中包括范围时,此方法才有效。如果范围在那儿,我就不会得到任何回报。只是没有结果。即使我将刻面更改为另一个术语而不是日期,我也一无