当前位置: 首页 > 面试题库 >

ElasticSearch-返回查询的构面的完整值

海翔宇
2023-03-14
问题内容

我最近开始使用ElasticSearch。我尝试完成一些用例。我对其中一个有问题。

我已经用他们的全名为一些用户建立了索引(例如“ Jean-Paul Gautier”,“ Jean De La Fontaine”)。

我尝试让所有全名响应某个查询。

例如,我希望以“ J”开头的100个最全名

{
  "query": {
    "query_string" : { "query": "full_name:J*" } }
  },
  "facets":{
    "name":{
      "terms":{
        "field": "full_name",
        "size":100
      }
    }
  }
}

我得到的结果是全名的所有单词:“ Jean”,“ Paul”,“ Gautier”,“ De”,“ La”,“ Fontaine”。

如何获得“ Jean-Paul Gautier”和“ Jean De La Fontaine”(所有全名值以“ J”开头)?“
post_filter”选项不执行此操作,它仅限制此子集。

  • 我必须配置full_name方面的“工作方式”
  • 我必须为此当前查询添加一些选项
  • 我必须做一些“映射”(暂时还不清楚)

谢谢


问题答案:

您只需要"index": "not_analyzed"在字段上进行设置,就可以在构面中获取完整的,未修改的字段值。

通常,最好有一个未分析的字段版本(用于分面),而另一个未分析的字段(用于搜索)。该"multi_field"字段类型是对这项有益的。

因此,在这种情况下,我可以如下定义映射:

curl -XPUT "http://localhost:9200/test_index/" -d'
{
   "mappings": {
      "people": {
         "properties": {
            "full_name": {
               "type": "multi_field",
               "fields": {
                  "untouched": {
                     "type": "string",
                     "index": "not_analyzed"
                  },
                  "full_name": {
                     "type": "string"
                  }
               }
            }
         }
      }
   }
}'

在这里,我们有两个子字段。默认名称与父名称相同。因此,如果您针对该"full_name"字段进行搜索,Elasticsearch将实际使用"full_name.full_name""full_name.untouched"将为您提供想要的方面结果。

因此,接下来我添加两个文档:

curl -XPUT "http://localhost:9200/test_index/people/1" -d'
{
   "full_name": "Jean-Paul Gautier"
}'

curl -XPUT "http://localhost:9200/test_index/people/2" -d'
{
   "full_name": "Jean De La Fontaine"
}'

然后,我可以在每个字段上查看返回的结果:

curl -XPOST "http://localhost:9200/test_index/_search" -d'
{
   "size": 0,
   "facets": {
      "name_terms": {
         "terms": {
            "field": "full_name"
         }
      },
      "name_untouched": {
         "terms": {
            "field": "full_name.untouched",
            "size": 100
         }
      }
   }
}'

我得到以下信息:

{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 2,
      "max_score": 0,
      "hits": []
   },
   "facets": {
      "name_terms": {
         "_type": "terms",
         "missing": 0,
         "total": 7,
         "other": 0,
         "terms": [
            {
               "term": "jean",
               "count": 2
            },
            {
               "term": "paul",
               "count": 1
            },
            {
               "term": "la",
               "count": 1
            },
            {
               "term": "gautier",
               "count": 1
            },
            {
               "term": "fontaine",
               "count": 1
            },
            {
               "term": "de",
               "count": 1
            }
         ]
      },
      "name_untouched": {
         "_type": "terms",
         "missing": 0,
         "total": 2,
         "other": 0,
         "terms": [
            {
               "term": "Jean-Paul Gautier",
               "count": 1
            },
            {
               "term": "Jean De La Fontaine",
               "count": 1
            }
         ]
      }
   }
}

如您所见,分析字段返回单个单词的小写标记(当您不指定分析器时,将使用标准分析器),而未分析的子字段将返回未修改的原始文本。

这是您可以使用的可运行示例:http
:
//sense.qbox.io/gist/7abc063e2611846011dd874648fd1b77450b19a5



 类似资料:
  • 问题内容: 我正在存储看起来像这样的文档: 然后,我用各种侧边栏过滤器显示这些列表,这些过滤器用于分类和日期(按年,按月)。根据用户选择的选项,结果查询可能最终看起来像: 这似乎完全按预期工作,除了当我尝试添加构面时,我可以在日期等旁边加上小数字(1)等: 仅当我不在查询中包括范围时,此方法才有效。如果范围在那儿,我就不会得到任何回报。只是没有结果。即使我将刻面更改为另一个术语而不是日期,我也一无

  • 嗨,我是elasticsearch的新手,现在我索引了一个网站,我想用我的查询的单词获得文本摘录, 示例I索引 Lorem ipsum dolor sit amet,consectetur adipiscing Elit。Morbi nec odio在magna blandit porta quis a Nibh。整数sodales ex ut sagittis venenatis。Duis ef

  • 问题内容: 在elasticsearch的实现中,基于几个字段,我只有几个简单的聚合,如下所示: 聚合工作正常,我得到了相应的结果。但是返回的标题键字段(或任何其他字段-多字)具有单个字的汇总和结果。我需要返回结果中的完整标题,而不是一个单词- 没什么意义。我该怎么办。 当前结果(仅是摘录)- 预期成绩 - 我浏览了很多文档,它解释了汇总结果的不同方法,但是如果结果中的字段中有字段,我找不到如何获

  • 问题内容: 我在Elasticsearch中有一个小型数据库,出于测试目的,我想拉回所有记录。我正在尝试使用以下形式的网址… 有人可以给我您用来完成此操作的URL吗? 问题答案: 我认为支持lucene语法是这样的: 大小默认为10,因此您可能还需要获取10个以上的商品。(其中BIGNUMBER等于您认为大于数据集的数字) 但是,elasticsearch文档建议使用扫描搜索类型针对大型结果集。

  • 问题内容: 我想知道为什么搜索特定术语会返回索引的所有文档,而不返回包含所请求术语的文档。 这是索引以及我的设置方法:(使用elasticsearch头插件浏览器界面) 然后我添加了一些文档: 因此,现在触发“ plaat”搜索时,人们会希望搜索会返回包含“ plaatstaal”的文档。 但是为我节省了更多的搜索,elasticsearch会恢复所有文档的大小,无论其文本内容如何。我在这里想念什

  • 问题内容: 我在使用VBA执行SQL查询并将结果复制到Excel工作表时遇到问题。 子执行时,它仅复制256的倍数的行(因此,只有256、512、768等行是填充到Excel中的行)。我从数据库中复制任何其他字段都没有问题。另外,当我在MySQL中运行相同的查询时,它也可以正常工作。对于SQL和VBA来说都是相当新的东西,我看不到任何原因导致此特定字段引起麻烦。我唯一能想到的是它的内容是一个始终以