我读到了匹配和多字查询,但似乎我需要做一些不同的事情。
让我们说我有以下问题:"这是一个测试"我希望在一个名为" 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实现此目的?
答案 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