【问题标题】:Elasticsearch query_string multivalue fieldsElasticsearch query_string 多值字段
【发布时间】:2016-03-02 11:08:44
【问题描述】:

我在我的 Ruby on Rails 项目的 1 中使用 ElasticSearch。对于 ElasticSearch,我大量使用 query_string

以下是我的项目设置:

Ruby-2.2.4、Rails-4.2.0、ElasticSearch-Model-0.1.8

我已经为数据编制了索引。使用 Article.import

现在,在控制台中,我正在获取所有已发布文章的计数,​​我正在使用:

Article.search(query: { query_string: { query: {"status:1"} } })

这很好用!现在,我想查找 user_ids

的文章

上面的 SQL 工作起来很迷人!

SELECT * FROM articles WHERE articles.user_id IN (5, 10)

但是,当我尝试对 query_string 使用相同的概念时,它不起作用!!

Article.search(query: { query_string: { query: "status:1 AND user_id:[5, 10]" } })

这给了我结果:

Elasticsearch::Transport::Transport::Errors::BadRequest: [400] {"error":"SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures {[mUk_rhx-RP6G5sJRMpfDwg][articles][0]: SearchParseException[[articles][0]: from[-1],size[-1]: Parse Failure [Failed to parse source [{\"query\":{\"query_string\":{\"query\":\"status:1 AND user_id:[5,10]\"}}}]]]; nested: QueryParsingException[[articles] Failed to parse query [status:1 AND user_id:[5,10]]]; nested: ParseException[Cannot parse 'status:1 AND user_id:[5,10]': Encountered \" \"]\" \"] \"\" at line 1, column 98.\nWas expecting one of:\n    \"TO\" ...\n    <RANGE_QUOTED> ...\n    <RANGE_GOOP> ...\n    ];

请帮助我了解我需要做什么才能完成这项工作!我在谷歌上搜索了很多,发现了几个选项,如 RANGE、TO 等,但不是这个:(

希望尽快收到您的来信!

【问题讨论】:

    标签: ruby-on-rails elasticsearch elasticsearch-rails


    【解决方案1】:

    在这种情况下,您不应使用 query_string。请改用terms query。要组合多个查询,请使用bool

    {
    "query": {
      "bool": {
         "must": [
            {
               "term": {
                  "status": 1
               }
            },
            {
               "terms": {
                  "user_id": [
                     5,
                     10
                  ]
               }
            }
           ]
         }
        }
      }
    

    【讨论】:

    • 感谢@richa 的快速回复我觉得使用terms query 有一个限制,因为我正在使用query_string 准备一些动态查询。因此,例如:现在,我正在构建基于 status and user_id 的查询,并且随着搜索范围的缩小,我希望将更多属性添加到该 query_string 中。我是弹性搜索的新手,是否可以将 query_string 和术语同时使用到 1 个单一查询中?
    • 更新了我的答案。已使用term 查询状态而不是query_string
    • 谢谢@richa,您的回答对我有用!仅供参考,我使用query_string 使用了很多复杂的查询我已经使用了query_string 提供的几乎所有东西,例如LIKE, GTE, LTE[] 还不支持 query_string 吗?
    • 对不起,但我从未在 query_string 中使用过列表。我更喜欢使用其他查询而不是query_string
    • 很抱歉在这里提出这么多问题,但我在这里做错了吗? Article.search({ query: { bool: { must: [ { term: { status: 1 } }, { range: { comments: { gte: 2 } } }, { range: { replies: { lte: 3 } } }, { terms: { "contributors": [73089,73090] } }, { terms: { article_type: ["Blog"] } } ] } } }).results.total 给出 0。
    猜你喜欢
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2018-05-20
    相关资源
    最近更新 更多