【问题标题】:Convert an infix expression to elastic search query将中缀表达式转换为弹性搜索查询
【发布时间】:2019-01-06 04:13:49
【问题描述】:

如何将中缀表达式转换为弹性搜索查询
我的运营商是! + *
用户可以使用这些运算符进行任何表达式,例如:
(((A*B*(!C))*(D*E))+F)*G
我希望在弹性搜索中将其转换为bool query

编辑
我不知道为什么我之前不这么说,但是我已经编写了一个将中缀转换为后缀表达式的代码,然后我调用了一个非常脏的递归方法来创建should (+), must (*) and must_not (!),但我正在寻找的是一种优化的方式为我做这个把戏。

我最后的查询是这样的,我认为这是非常非常讨厌的:

{
  "from": 0,
  "size": 10,
  "_source": [
    "*"
  ],
  "index": "insta_userpost_new2",
  "body": {
    "query": {
      "bool": {
        "must": [
          {
            "match_phrase": {
              "caption.text": "G"
            }
          },
          {
            "bool": {
              "should": [
                {
                  "match_phrase": {
                    "caption.text": "F"
                  }
                },
                {
                  "bool": {
                    "must": [
                      {
                        "bool": {
                          "must": [
                            {
                              "match_phrase": {
                                "caption.text": "E"
                              }
                            },
                            {
                              "match_phrase": {
                                "caption.text": "D"
                              }
                            }
                          ]
                        }
                      },
                      {
                        "bool": {
                          "must": [
                            {
                              "bool": {
                                "must_not": [
                                  {
                                    "match_phrase": {
                                      "caption.text": "C"
                                    }
                                  },
                                  {
                                    "bool": {
                                      "must": [
                                        {
                                          "match_phrase": {
                                            "caption.text": "B"
                                          }
                                        },
                                        {
                                          "match_phrase": {
                                            "caption.text": "A"
                                          }
                                        }
                                      ]
                                    }
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                }
              ]
            }
          }
        ]
      }
    }
  }
}

【问题讨论】:

  • * 表示 AND 和 + 表示 OR 吗?还是这些符号有其他含义?
  • @Val 是的,它们的意思是 OR 和 AND
  • 好的,谢谢,今天晚些时候我会提供答案

标签: php algorithm elasticsearch


【解决方案1】:

我可能会尝试利用simply_query_string。为此,您必须:

  • + 替换为|(对于OR
  • 然后将* 替换为+(对于AND
  • 最终将! 替换为-(对于NOT

所以如果用户输入这个:

(((A*B*(!C))*(D*E))+F)*G

你最终会得到这个

(((A+B+(-C))+(D+E))|F)+G

这是一个布尔表达式,您可以直接在 simply_query_string 查询中使用。

GET /_search
{
    "query": {
        "simple_query_string" : {
            "fields" : ["content"],
            "query" : "(((A+B+(-C))+(D+E))|F)+G"
        }
    }
}

【讨论】:

  • 嗯,我现在无法访问我的电脑,但如果可以的话,我拥有你很多
  • 太棒了,我很高兴它有帮助 ;-)
【解决方案2】:

您可以在查询中使用 Elasticsearch 脚本,如下所示: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-script-query.html

脚本选项很少,最简单和最严格的是“无痛”脚本。来自弹性文档:

当您在 Kibana 中定义脚本化字段时,您可以选择脚本语言。从 5.0 开始,默认选项是 Lucene 表达式和 Painless

您还可以使用脚本字段返回计算结果: https://www.elastic.co/guide/en/kibana/current/scripted-fields.html

【讨论】:

    【解决方案3】:

    您可以运行中缀表达式求值[1],并将标准 eval 操作替换为 DSL bool 查询组合器。

    我们实际上为https://opensource.appbase.io/mirage/ 做了类似的事情(你可以现场试用),我们将 GUI 块映射到可组合的布尔查询。源代码可在https://github.com/appbaseio/mirage查看。

    [1] 参考:https://www.geeksforgeeks.org/expression-evaluation/

    【讨论】:

    • 非常好的查询作曲家,谢谢分享,我会仔细看看。
    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多