【问题标题】:Why elasticsearch matchQuery does not return results?为什么elasticsearch matchQuery 不返回结果?
【发布时间】:2019-11-05 16:44:15
【问题描述】:

我已使用 elasticsearch 成功索引内容,但在尝试查询内容时遇到问题。

我想要做的是搜索 所有文档 都包含值“ipsum”(在任何术语中)AND 术语“type”应该等于“cq:Page”。

我正在使用高级 Rest Java 客户端。尝试使用过滤和 Boolquery,但它返回零结果。

例子:

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.from(0);
sourceBuilder.size(10);

SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("gettingstarted");
searchRequest.source(sourceBuilder);

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
                boolQueryBuilder.must(QueryBuilders.queryStringQuery("ipsum"));
boolQueryBuilder.must(QueryBuilders.matchQuery("type", "cq:Page"));
sourceBuilder.query(boolQueryBuilder);


SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

数据如下所示:

{ 
   "took":4,
   "timed_out":false,
   "_shards":{ 
      "total":1,
      "successful":1,
      "skipped":0,
      "failed":0
   },
   "hits":{ 
      "total":{ 
         "value":1,
         "relation":"eq"
      },
      "max_score":1.0,
      "hits":[ 
         { 
            "_index":"gettingstarted",
            "_type":"_doc",
            "_id":"2",
            "_score":1.0,
            "_source":{ 
               "docs":[ 
                  { 
                     "id":"/content/we-retail/us/en/community/members",
                     "type":"cq:Page",
                     "jcr_title":"Members",
                     "jcr:created":"java.util.GregorianCalendar[time=1564730906165,areFieldsSet=true,areAllFieldsSet=true,lenient=false,zone=sun.util.calendar.ZoneInfo[id=\"GMT+02:00\",offset=7200000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=7,WEEK_OF_YEAR=31,WEEK_OF_MONTH=1,DAY_OF_MONTH=2,DAY_OF_YEAR=214,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=9,HOUR_OF_DAY=9,MINUTE=28,SECOND=26,MILLISECOND=165,ZONE_OFFSET=7200000,DST_OFFSET=0]",
                     "cq:lastModified":"java.util.GregorianCalendar[time=1518654268630,areFieldsSet=true,areAllFieldsSet=true,lenient=false,zone=sun.util.calendar.ZoneInfo[id=\"GMT-05:00\",offset=-18000000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=1,WEEK_OF_YEAR=7,WEEK_OF_MONTH=3,DAY_OF_MONTH=14,DAY_OF_YEAR=45,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=24,SECOND=28,MILLISECOND=630,ZONE_OFFSET=-18000000,DST_OFFSET=0]",
                     "manualCreationDate":"2019-09-05T13:21:00.000+02:00",
                     "jcr:primaryType":"cq:PageContent",
                     "sling:resourceType":"social/console/components/basepage",
                     "searchDescription":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sportsman delighted improving dashwoods gay instantly happiness six. Ham now amounted absolute not mistaken way pleasant whatever. At an these still no dried folly stood thing. Rapid it on hours hills it seven years. If polite he active county in spirit an. Mrs ham intention promotion engrossed assurance defective. Confined so graceful building opinions whatever trifling in. Insisted out differed ham man endeavor expenses. At on he total their he songs. Related compact effects is on settled do.",
                     "pageImportanceRank":"4"
                  }, ...

也试过了,但没有成功,它返回零结果。

boolQueryBuilder.must(QueryBuilders.matchQuery("type", NT_PAGE));

【问题讨论】:

  • 请分享您的映射
  • 中间有很多条件,我加了一些简化的。

标签: java elasticsearch


【解决方案1】:

也许是这样的:

GET index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "ipsum",
            "fields": []
          }
        },
        {
          "match": {
            "type": "cq:Page"
          }
        }
      ]
    }
  }
}

"fields": [] -> meaning all fields

【讨论】:

  • 这里与我的查询有什么区别?我尝试使用 Java,但没有成功。
  • 我正在使用 multi_match 查询字符串。试试 QueryBuilders.multiMatchQuery(你的文字)
  • 是的,但是这个 boolQueryBuilder.must(QueryBuilders.matchQuery("type", NT_PAGE));返回零个结果。
  • 其中 NT_PAGE 代表“cq:Page”。我也试过cq\\:Page,但结果是一样的
  • 如果你通过 kibana 运行我的查询,你会得到任何结果吗?
【解决方案2】:

它可以使用 ma​​tchPhraseQuery 而不是 matchQuery。 我的值是“cp:Page”。

在这种情况下,matchQuery 仅当该词的值与其索引中的值完全相同时才会返回文档(并且在查询时没有使用分析器)。

另一方面,ma​​tchPhraseQuery 也会在查询时使用默认分析器,因此查询中的值将与分析器更改后的索引值相同。

可以按查询、按字段或按索引指定分析器。在索引时,Elasticsearch 将按以下顺序查找分析器:

字段映射中定义的分析器。一个名为 default 的分析器 在索引设置中。标准分析仪。在查询时,有 再增加几层:

全文查询中定义的分析器。 search_analyzer 定义 在字段映射中。在字段映射中定义的分析器。一个 在索引设置中名为 default_search 的分析器。一个名为的分析器 索引设置中的默认值。标准分析仪。

【讨论】:

    猜你喜欢
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2014-10-23
    • 1970-01-01
    • 2012-07-28
    • 2013-03-10
    • 2019-01-14
    相关资源
    最近更新 更多