当前位置: 首页 > 知识库问答 >
问题:

有没有一种方法可以通过改变搜索值来构建弹性查询?

宋畅
2023-03-14

我想在PHP中使用Elastic来处理来自我网站的搜索请求。例如,我有搜索参数

  • 名称
  • 年龄
  • 高度
  • 重量

但是不应该总是搜索所有参数。

所以可能只有(< code >姓名和< code >年龄)有值,而(< code >身高和< code >体重)没有值。

有没有办法构建一个具有灵活/不断变化的输入值的查询?

当没有(身高体重)的搜索值时,下面的查询将不起作用。

{
  "query": {
    "bool": {
      "should": [
        { "match": { "name.keyword": "Anna" } },
        { "match": { "age": "30" } },
        { "match": { "height": "180" } },
        { "match": { "weight": "70" } }
      ]
    }
  }
}

共有3个答案

易弘阔
2023-03-14

它们是解决Elasticsearch中问题的多种方法

您可以使用参数minimum_should_match

您可以使用带条件的模板查询。

您还可以执行更复杂的bool查询,枚举匹配的可能性。

您还可以使用脚本对您想要看到的逻辑进行编程。

POST /_bulk
{"index":{"_index":"73121817"}}
{"name": "ana", "age": 1, "height": 180, "weight": 70}
{"index":{"_index":"73121817"}}
{"name": "jack", "height": 180, "weight": 70}
{"index":{"_index":"73121817"}}
{"name": "emma", "age": 1, "weight": 70}
{"index":{"_index":"73121817"}}
{"name": "william", "age": 1, "height": 180}
{"index":{"_index":"73121817"}}
{"name": "jenny", "weight": 70}
{"index":{"_index":"73121817"}}
{"name": "marco", "age": 1}
{"index":{"_index":"73121817"}}
{"name": "giulia", "height": 180}
{"index":{"_index":"73121817"}}
{"name": "paul"}


GET 73121817/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "name.keyword": "Anna" } },
        { "match": { "age": "30" } },
        { "match": { "height": "180" } },
        { "match": { "weight": "70" } }
      ],
      "minimum_should_match": 2
    }
  }
}

如果最小值应匹配设置为2,则只返回两个文档:anajack

瓦尔的回答很完整

你也可以参考医生

参考链接后面的so帖子

GET 73121817/_search
{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": """
            return (!doc["name.keyword"].empty && !doc["age"].empty);
          """
        }
      }
    }
  }
}
浦德明
2023-03-14

您需要在构建 Elasticsearch 查询的应用程序中进行处理,并且在应用程序中执行此操作非常容易,因为您知道从 UI 获得的所有搜索参数值,如果它们不为 null,则仅在 Elasticsearch 查询中包含这些字段。

Elasticsearch不支持查询中的if…else-like条件。

薛彭薄
2023-03-14

搜索救援模板:

POST _scripts/my-search-template
{
  "script": {
    "lang": "mustache",
    "source": """
    {
      "query": {
        "bool": {
          "should": [
            {{#name}}
             { "match": { "name.keyword": "{{name}}" } },
            {{/name}}
            {{#age}}
             { "match": { "age": "{{age}}" } },
            {{/age}}
            {{#height}}
             { "match": { "height": "{{height}}" } },
            {{/height}}
            {{#weight}}
             { "match": { "weight": "{{weight}}" } },
            {{/weight}}
             { "match_none": { } }
          ]
        }
      }
    }
    """
  }
}

请注意,由于您不知道您有多少个条件,因此最后一个条件始终为假,并且仅用于确保JSON有效(即最后一个逗号不会保持悬空状态)

然后可以像这样运行查询:

POST my-index/_search/template
{
  "id": "my-search-template",
  "params": {
    "name": "Anna",
    "age": 30
  }
}
 类似资料:
  • 问题内容: 通过,我们可以创建/修改连接的参数,但是我想知道是否可以通过API进行相同的操作,以便可以以编程方式设置连接 似乎它只处理实际连接到实例,而不是将其保存到列表中。似乎应该已经实现了一个功能,但是我不确定在哪里可以找到该特定功能的文档。 问题答案: 连接实际上是一个模型,可以用来查询和插入新连接

  • 问题内容: 我有一个这样的html代码段: html中此元素的唯一唯一标识是attribute ,因此我想使用 某种 Pythonselenium 方法 来定位它,如下所示: 我已经检查了selenium(python)文档以查找元素, 但是没有获得关于如何通过attr 定位此elem的线索。有没有在pythonselenium中找到该元素的明确方法? 问题答案: 您可以 通过xpath 获取它并

  • 问题内容: 我正在使用GhostDriver的Java绑定对PhantomJS运行Selenium接受测试。 如果PhantomJS请求的网页之一通过console.log登录到Javascript控制台,是否可以捕获或查看这些消息? 我想这的答案很简单,但我无法解决! 问题答案:

  • 问题内容: 现在我正在做: 有没有更有效的方法直接从Find(或其他搜索功能)中获取带有用户名的slice,而没有struct和range循环? 问题答案: MongoDB的结果始终是文档列表。因此,如果要获取值列表,则必须像以前一样手动将其转换。 使用自定义类型(源自) 另外请注意,如果您要创建自己的类型(从派生),则可以覆盖其取消编组逻辑,并仅从文档中“提取” 。 它看起来像这样: 然后将用户

  • 我正在用SpringBoot构建一个应用程序。我有一个存储库,我通过以下方式从方法名称创建查询: 这样的查询可以工作,方法调用的结果是具有该名称的用户。在Spring Boot中是否可以按名称创建查询,其中输入是名称列表,输出是用户列表,其中每个用户至少对应于列表中的一个名称?例如: 我也试过这样的方法,但是行不通。

  • 我试图从弹性搜索获取记录,我得到这个错误如下 我的Java代码如下 请让我知道,如果我错过了一些东西,而试图索引,我是新的弹性搜索。 同样,如果我想在我的查询中包括一个以上的条件,如下面所示 下面是上述查询的结果,它工作正常 我如何与上面的geoboundingbox查询相结合?我需要将其添加为过滤器吗? 更新:依赖关系 提前谢谢Rakesh