我读过关于匹配和多词查询,但似乎我需要做一些不同的事情。
假设我有以下查询:"这是一个测试",我想在一个名为"文本"的字段中找到该查询。我想要得到的对象匹配的一些查询(不管有多少字),但只有那些对象的查询值包含文本字段的每个单词。
查询示例:"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