弹性搜索查询,以检查列表中的所有项目是否都存在于字符串中

时间:2018-07-25 20:06:26

标签: python elasticsearch elasticsearch-dsl elasticsearch-query elasticsearch-dsl-py

我的数据如下所示:

[
  {
    “name”: "/key1=value1/key2=value2/key3=value3"
  },
  {
    “name”: "/key1=value1"
  },
  {
    “name”: "/key1=value1/key4=value4"
  }
]

我正试图形成一个弹性搜索查询,使得:

如果我输入的是:

示例1:

/key3=value3/key1=value1/key2=value2

在结果中给我以下名字:

[
  {
    “name”: "/key1=value1/key2=value2/key3=value3"
  }
]

因此,我的输入查询可以被视为与-> key3=value3 AND key1=value1 AND key2=value2之类的AND操作,因此,如果所有三个名称都以任何名称出现,则该名称将出现在响应中。

示例2:

/key4=value4

在结果中给我以下名字:

[
  {
    “name”: "/key1=value1/key4=value4"
  }
]

示例3:

/key2=value2/key1=value1

在结果中给我以下名字:

[
  {
    “name”: "/key1=value1/key2=value2/key3=value3"
  }
]

因为此名称仅同时存在key2 = value2和key1 = value1。

示例4:

/key1=value1

在结果中给我以下名字:

[
  {
    “name”: "/key1=value1/key2=value2/key3=value3"
  },
  {
    “name”: "/key1=value1"
  },
  {
    “name”: "/key1=value1/key4=value4"
  }
]

因为三个名称中的所有key1 = value1都存在。

我认为应该是这样的方法:

将输入表达式拆分为斜杠(/)

例如:考虑示例1:

/key3=value3/key1=value1/key2=value2

形成一个列表,例如:[key3=value3,key1=value1,key2=value2]

然后尝试检查列表中的每个项目是否应该存在于名称字符串中。但我不知道在这种情况下如何编写查询。

我正在使用elasticsearch_dsl’s python库的Q函数来构成查询。

我正在尝试如下操作:

https://www.elastic.co/guide/en/elasticsearch/guide/2.x/match-multi-word.html#match-improving-precision。 (似乎可以达到我的目的)

如果输入为: / key3 = value3 / key1 = value1 / key2 = value2

{
    "query": {
        "match": {
            "name": {      
                "query":    " /key3=value3 /key1=value1/ key2=value2",
                "operator": "and"
            }
        }
    }
}

但是我不知道如何使用'Q'编写相同的内容,或者有没有更好的方法来实现上述查询?

0 个答案:

没有答案