【问题标题】:Elasticsearch: REST API works but the Java counterpart doesn'tElasticsearch:REST API 有效,但 Java 对应物无效
【发布时间】:2014-03-03 11:43:16
【问题描述】:

我在 Elastic Search 中有一份文档:

{
   "accountGroupId":1000,
   "name":"Elastic Burgers",
   "capacity":33,
   "startTime":1391604480000,
   "address":{
      "streetName":"Rua Carlos Petit",
      "streetNumber":"111",
      "complement":"",
      "neighborhood":"Vila Mariana",
      "city":"São Paulo",
      "state":"SP",
      "country":"Brasil",
      "zip":"04110000",
      "position":{
         "latitude":-23.5845048,
         "longitude":-46.6358975
      },
      "accountGroupId":1000,
      "status":[

      ],
      "id":1000,
      "createTime":1391010548111,
      "updateTime":1391010548111
   },
   "flyerUrl":"/assets/images/placeholder-merchant.png",
   "backgroundImageUrl":"/assets/images/placeholder-merchant.png",
   "onSaleStartTime":1391604480000,
   "onSaleEndTime":1392990480000,
   "description":"Lorem Ipsum",
   "eventCategoryId":1000,
   "deleted":false,
   "installmentId":100,
   "feeId":101,
   "restricted":false,
   "venueAccountGroupId":15,
   "updateTime":1391691790113,
   "createTime":1391691790113,
   "id":1002,
   "venue":"Acme, Inc.",
   "category":"Festa Faculdade"
}

此 REST 查询返回文档:

curl -XGET 'http://localhost:9200/paguemob/events/_search' -d '{
    "query": {
        "multi_match" : {
            "query" : "festa de faculdade",
            "fields" : ["name", "address.city", "venue", "category", "description"]
        }    
    }
}'

但如果我通过 Java API 运行等效查询,结果为空:

client
  .prepareSearch(index)
  .setQuery(multiMatchQuery("festa de faculdade", "name", "address.city", "venue", "category", "description"))
  .setSize(200)
  .execute()
  .actionGet()
  .getHits

我做错了什么?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    查看一些ES test code,我发现除了multiMatchQuery 本身之外,它们还将OR 设置为运算符(我假设这是默认值)并将useDisMax 设置为false,并将type.

       searchResponse = client().prepareSearch("test")
       .setQuery(multiMatchQuery("marvel hero captain america", "full_name", "first_name", "last_name", "category")
       .operator(MatchQueryBuilder.Operator.OR).useDisMax(false).type(type)).get();
    

    我想知道其中一个是否是诀窍?

    另外,您的示例可能没有显示它,但您是否正确访问 Java 中的命中结果数组?

    searchResponse.getHits().hits()[0]
    

    【讨论】:

    • OR 操作符是默认操作符,至于 dismax 会影响分数的计算方式,但这似乎不是没有返回 doc 的原因。跨度>
    【解决方案2】:

    我发现了错误:我没有设置搜索的类型。因此,在调用中添加 .setTypes("events") 就可以了。

    【讨论】:

    • 奇怪,同一个索引下还有其他类型吗?
    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2016-07-05
    • 2016-03-09
    • 2020-07-10
    相关资源
    最近更新 更多