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



我读过关于匹配和多词查询,但似乎我需要做一些不同的事情。

假设我有以下查询:"这是一个测试",我想在一个名为"文本"的字段中找到该查询。我想要得到的对象匹配的一些查询(不管有多少字),但只有那些对象的查询值包含文本字段的每个单词。

查询示例:"this is a test"。我想要得到这些对象:

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实现这一点?

这是一种hack,但是我能够让它与脚本过滤器一起工作:

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

最新更新