我目前正在尝试将一个基于Solr的应用程序迁移到ElasticSearch。
我有这个lucene查询
((
name:(+foo +bar)
OR info:(+foo +bar)
)) AND state:(1) AND (has_image:(0) OR has_image:(1)^100)
根据我的理解,这是一个必须子句与布尔OR结合的组合:
“获取名称中包含(foo和bar)或信息中包含(foo和bar)的所有文档。之后,根据条件筛选结果state=1,并增强具有图像的文档。”
我一直试图在MUST中使用bool查询,但未能将boolean或转换为MUST子句。以下是我的资料:
GET /test/object/_search
{
"from": 0,
"size": 20,
"sort": {
"_score": "desc"
},
"query": {
"bool": {
"must": [
{
"match": {
"name": "foo"
}
},
{
"match": {
"name": "bar"
}
}
],
"must_not": [],
"should": [
{
"match": {
"has_image": {
"query": 1,
"boost": 100
}
}
}
]
}
}
}
如您所见,缺少“info”的必须条件。
有人有解决办法吗?
太感谢你了。
**更新**
我已经更新了我的elasticsearch查询,并且去掉了那个函数分数。我的基地问题仍然存在。
我最终创建了一个查询,该查询完全符合我的要求:
筛选的嵌套布尔查询。我不确定为什么这没有记录在案。也许这里有人能告诉我?
以下是查询:
GET /test/object/_search
{
"from": 0,
"size": 20,
"sort": {
"_score": "desc"
},
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"state": 1
}
}
]
}
},
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"match": {
"name": "foo"
}
},
{
"match": {
"name": "bar"
}
}
],
"should": [
{
"match": {
"has_image": {
"query": 1,
"boost": 100
}
}
}
]
}
},
{
"bool": {
"must": [
{
"match": {
"info": "foo"
}
},
{
"match": {
"info": "bar"
}
}
],
"should": [
{
"match": {
"has_image": {
"query": 1,
"boost": 100
}
}
}
]
}
}
],
"minimum_should_match": 1
}
}
}
}
}
在伪SQL中:
SELECT * FROM /test/object
WHERE
((name=foo AND name=bar) OR (info=foo AND info=bar))
AND state=1
请记住,内部如何处理name=foo取决于您的文档字段分析和映射。这可以从模糊到严格的行为。
“minimum_should_match”:1表示至少有一个should语句必须为真。
这些语句意味着,只要resultset中有一个包含has_image:1的文档,它就会增加因子100。这将更改结果顺序。
"should": [
{
"match": {
"has_image": {
"query": 1,
"boost": 100
}
}
}
]
玩得开心的家伙:)
示例:
您希望看到所有的项目(圆形和(红色或蓝色)):
{
"query": {
"bool": {
"must": [
{
"term": {"shape": "round"}
},
{
"bool": {
"should": [
{"term": {"color": "red"}},
{"term": {"color": "blue"}}
]
}
}
]
}
}
}
您还可以执行OR的更复杂版本,例如,如果您希望至少匹配5个选项中的3个,您可以在“should”下指定5个选项,并将“minimum_should”设置为3。
感谢Glen Thompson和Sebastialonso找到了我之前不太合适的筑巢位置。
还要感谢Fatmajk指出在ElasticSearch 6中“term”变成了“match”。
问题内容: 我目前正在尝试将基于Solr的应用程序迁移到Elasticsearch。 我有这个lucene查询 据我了解,这是MUST子句与布尔OR的组合: “获取所有包含(名称中包含foo AND条)或(信息中包含foo AND条)的所有文档。在此之后,按条件state = 1过滤结果,并增强具有图像的文档。” 我一直在尝试将布尔查询与MUST一起使用,但是我无法将布尔OR放入must子句中。这
基本上,我有一组顶点ID,我想遍历并从某些外边找到一组顶点。我想把外边后面的顶点与它来自的准确性联系起来。例如:,所以v1有2个输出边(e1和e2)到v2和v4,而v3有2个输出边(e3和e4)到v5和v6。我想要的是得到如下所示的遍历结果 有人能帮我使用Gremlin遍历吗?最接近的例子是
如何用UNION操作符将多条SELECT语句组合成一个查询 组合查询 并(union) 执行多个查询并将结果作为单个查询结果返回。 一般需要使用组合查询的情况 单个查询中从不同的表类似返回结果数据 单个表执行多个查询,按单个查询返回数据 创建组合查询 检索 IL,IN,MI几个洲的客户报表。 mysql> SELECT cust_name, cust_contact, cust_email
如何对同一嵌套下的多个字段执行“必须”“匹配”查询?这是一个可复制的ES索引,其中“用户”字段定义为“嵌套”类型。 这里有2份文件: 对于这个索引,如何查询“John”和“Alice”都存在的文档?使用上面定义的索引,我希望得到的是文档1,而不是文档2。到目前为止,我已经尝试了以下代码,但没有收到任何结果:
除了查询之外,两者的提取看起来完全相同: 第一个查询返回: 但第二个查询返回错误: 但我得到了同样的错误
我想它一定是在请求体。我如何发送‘更新’查询或我做错了?