仅当查询包含对象字段的所有单词时才匹配查询返回记录

时间:2015-07-26 12:16:53

标签: elasticsearch spring-data-elasticsearch

我读到了匹配和多字查询,但似乎我需要做一些不同的事情。

让我们说我有以下问题:"这是一个测试"我希望在一个名为" text"的字段中找到该查询。我希望获得与某些查询匹配的对象(并不重要的是多少个单词),但只有查询值包含文本字段的每个单词的对象。

查询示例:"这是一个测试"。我想得到那些对象:

obj1: {"text":"this is a test"}
obj2: {"text":"this is a"}
obj3 : { "text" : "is a" }
obj4 : { "text" : "test" }

但是如果obj在文本字段中有更多内容,则不会返回例如:

obj5: {"text":"this is a test and something more"}

是否可以使用Elasticsearch实现此目的?

1 个答案:

答案 0 :(得分:1)

这是一种黑客攻击,但我能够使用script filter来使用它:

POST /test_index/_search
{
   "query": {
      "match": {
         "text": "this is a test"
      }
   },
   "filter": {
      "script": {
         "script": "for(val in doc[\"text\"].values){ if(!(val in terms)){ return false; }}; return true;",
         "params": {
            "terms": ["this", "is", "a", "test"]
         }
      }
   }
} 

我认为有更好的方法可以做到这一点,但并没有立即想出一个。使用脚本在生产中可能会有问题,除非您的ES群集落后于某种类型的身份验证墙。

无论如何,这是我用来测试它的代码:

http://sense.qbox.io/gist/3929abc89d71ebf724e6121b1b5ba6da54501088