【问题标题】:ElasticSearch search query for has many relationship models railsElasticSearch 搜索查询有很多关系模型 rails
【发布时间】:2016-05-14 17:21:42
【问题描述】:

我正在使用 ElasticSearch 服务器搜索所有类型的书的 ISBN、书名和书名。我已经使用三个具有类似关系的模型进行了索引,

书籍 hash_many additional_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') 上搜索时,搜索必须只针对所有书籍的主题值。 我怎样才能只搜索主题而不搜索其他列?

【问题讨论】:

    标签: ruby-on-rails elasticsearch


    【解决方案1】:

    以下是我如何在两个特定列中搜索对象的示例,只是为了让您更好地了解如何添加查询。第二个查询是如何在弹性搜索中进行精确查询:

    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”eelection_district ED-011 匹配的前 1000 条记录。所以在你的情况下,你会这样做:

    Book.search( query: { bool: { must: [ {match: { subject: "general"}} ] } } ).results
    

    'From' 是偏移量,'size' 是返回的最大数据集。另外,我看到很多人忽略的一个关键点是,当您搜索知道要在数据库中查找的确切值的数据时,您可以使用过滤器而不是查询,它们会更快。如果您知道您需要与主题“一般”而不是迂回或接近它的东西完全匹配,那么下面将介绍如何使用过滤器。

    Book.search( query: { bool: { filter: [ {term: { subject: "general"}} ] } } ).results
    

    【讨论】:

    • 感谢您的回复。所以我有一个要求,比如我只想搜索所有书籍的所有主题的标题,并且只需要那个结果。
    • 哦,我明白了,我现在正在用手机打字,但我建议尝试将中间的查询更改为主题:{标题:'一般'}而不是主题:“一般” .当我回到我的比赛时,我会更深入地研究。
    【解决方案2】:

    如果您将使用query_string 查询,您可以将default field 更改为默认_all https://www.elastic.co/guide/en/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/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_multi_field:

    {
        query: {
            query_string: {
                query:            query,
                default_operator: 'AND',
                fields : ['subject.title']
            }
        }
    }
    

    我想如果你在你的方法中将字段名作为参数会更好。

    【讨论】:

    • 我只需要搜索主题的标题。那么我可以像主题[:title]这样进行查询吗意味着它将仅搜索主题的“标题”字段
    • 你可以制作["subject.title"]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2018-09-08
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多