![](/img/trans.png)
[英]Rails query for models having has_many and belongs_to relationship
[英]ElasticSearch search query for has many relationship models rails
我正在使用ElasticSearch服务器搜索具有所有类型的书籍的ISBN,书籍标题和书籍的主题标题的书籍。 我已经完成了三个模型之间的索引,它们之间的关系如下:
本书hash_many extra_isbns,主题
书hash_one别名
我的索引看起来像
{
"_index":"books","_type":"book","_id":"9781135028411","_score":0.6377245,
"_source":{"book_vbid": "9781135028411","book_title": "Objectivity, Science and Society","book_author":"Paul A Komesaroff",
"additional_isbn": [{"isbn_value": "0415474876"},{"isbn_value": "9780415474870"}],
"aliase": {"eisbn_canonical":"9781135028411","isbn_canonical":"9781135028411","print_isbn_canonical":"9780415474870","isbn13":"9781135028411","isbn10":"1135028419"},
"subjects": [{"title": "General"},{"title": "General"},{"title": "General"},{"title": "Physical & Earth Sciences -> Science -> General"},{"title": "Social Sciences -> Philosophy -> General"},{"title": "Social Sciences -> Social Sciences -> General"}]}},{
"_index":"books","_type":"book","_id":"9781135027896","_score":0.6348529,
"_source":{"book_vbid": "9781135027896","book_title": "Beyond Empiricism","book_author":"Andrew Tudor",
"additional_isbn": [{"isbn_value": "0415475007"},{"isbn_value": "9780415475006"}],
"aliase": {"eisbn_canonical":"9781135027896","isbn_canonical":"9781135027896","print_isbn_canonical":"9780415475006","isbn13":"9781135027896","isbn10":"1135027897"},
"subjects": [{"title": "General"},{"title": "General"},{"title": "General"},{"title": "Physical & Earth Sciences -> Science -> General"},{"title": "Social Sciences -> Philosophy -> General"},{"title": "Social Sciences -> Social Sciences -> General"}]}},{
"_index":"books","_type":"book","_id":"9781134429059","_score":0.6258716,
"_source":{"book_vbid": "9781134429059","book_title": "Your Murderer","book_author":"Vassily Aksyonov",
"additional_isbn": [{"isbn_value": "9057551039"},{"isbn_value": "9789057551031"}],
"aliase": {"eisbn_canonical":"9781134429059","isbn_canonical":"9781134429059","print_isbn_canonical":"9789057551031","isbn13":"9781134429059","isbn10":"1134429053"},
"subjects": [{"title": "General"},{"title": "General"},{"title": "Humanities -> Performing Arts -> General"},{"title": "Humanities -> TheatrGeneral"}]}}
我有类似的搜索方法,
def self.search(query, options = {})
es_options =
{
query: {
query_string: {
query: query,
default_operator: 'AND',
}
},
sort: '_score',
}.merge!(options)
__elasticsearch__.search(es_options) end
我的要求就像我在Book.search('general')
上进行搜索时Book.search('general')
,搜索必须仅针对所有书籍的主题值。 我该如何只搜索主题而不搜索其他列?
这是一个示例,说明了如何在两个特定的列中搜索对象,只是为了让您清楚地了解如何添加查询。 第二个查询是如何在弹性搜索中执行精确查询:
User.search( from: 0, size: 1000, query: { bool: { must: [ {match: { assembly_district: "AD\-13"}}, {match: { election_district: "ED\-011"}} ] } } ).records.last
这将返回与AssemblyDistrict AD-13和“ ALSO” lection_district ED-011相匹配的前1000条记录。 因此,您可以这样做:
Book.search( query: { bool: { must: [ {match: { subject: "general"}} ] } } ).results
“ From”是偏移量,“ size”是返回的最大数据集。 另外,我看到很多人忽略的一个关键问题是,当您搜索可以在数据库中找到确切值的数据时,可以使用过滤器而不是查询,它们会更快。 如果您知道需要与主题“常规”完全匹配而不是环形交叉路口或其附近,则下面将介绍如何使用过滤器。
Book.search( query: { bool: { filter: [ {term: { subject: "general"}} ] } } ).results
如果您要使用query_string
查询,则可以将default field
_all
为默认https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/query-dsl-query-string-query.html#_default_field :
{
query: {
query_string: {
query: query,
default_operator: 'AND',
default_field : 'subject.title'
}
}
}
或者您可以使用fields
https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/query-dsl-query-string-query.html#_multi_field :
{
query: {
query_string: {
query: query,
default_operator: 'AND',
fields : ['subject.title']
}
}
}
我想如果将字段名称作为方法中的参数会更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.