我想在PHP中使用Elastic来处理来自我网站的搜索请求。例如,我有搜索参数
名称
年龄
高度
重量
但是不应该总是搜索所有参数。
所以可能只有(< code >姓名和< code >年龄)有值,而(< code >身高和< code >体重)没有值。
有没有办法构建一个具有灵活/不断变化的输入值的查询?
当没有(身高
和体重
)的搜索值时,下面的查询将不起作用。
{
"query": {
"bool": {
"should": [
{ "match": { "name.keyword": "Anna" } },
{ "match": { "age": "30" } },
{ "match": { "height": "180" } },
{ "match": { "weight": "70" } }
]
}
}
}
它们是解决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,则只返回两个文档:ana
和jack
瓦尔的回答很完整
你也可以参考医生
参考链接后面的so帖子
GET 73121817/_search
{
"query": {
"bool": {
"filter": {
"script": {
"script": """
return (!doc["name.keyword"].empty && !doc["age"].empty);
"""
}
}
}
}
}
您需要在构建 Elasticsearch 查询的应用程序中进行处理,并且在应用程序中执行此操作非常容易,因为您知道从 UI 获得的所有搜索参数值,如果它们不为 null,则仅在 Elasticsearch 查询中包含这些字段。
Elasticsearch不支持查询中的if…else-like条件。
搜索救援模板:
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