我有一个包含数千个文档的索引(比如10000)。
我针对它运行的查询用于自动填充搜索:filtered
filter
匹配小文档子集(比如说100),query
作为match_phrase_prefix
。
问题是,只有当我设置大max_expansions
时(例如1000,默认情况下它的50对吗?),我才会得到我期望的结果。
如果我做对了,ES首先进行查询,找到max_expansions
个术语,然后将过滤器应用到它到目前为止找到的内容。
如果max_expansion
很小,那么文档匹配过滤器根本不会被包含在内的可能性很高。
问题是,是否有办法首先进行过滤以减少结果集?
完成建议器无法正常工作,因为它不允许过滤。 前缀过滤器不起作用,因为它不分析查询字符串,我需要它。
ES 1.0.1 。
UPD。以下是要重现的查询:
curl -XDELETE 'http://localhost:9200/test_max_expansions/'
curl -XPUT 'http://localhost:9200/test_max_expansions/'
curl -XPUT 'http://localhost:9200/test_max_expansions/posts/_mapping' -d '
{
"posts" : {
"properties" : {
"title" : {"type" : "string"},
"hidden" : {"type" : "boolean"}
}
}
}'
for i in {1..1000}; do curl -XPUT "http://localhost:9200/test_max_expansions/posts/$i" -d "{\"title\" : \"a$i\", \"hidden\" : false}"; done
curl -XPUT 'http://localhost:9200/test_max_expansions/posts/1001' -d '
{
"title" : "a1001",
"hidden" : true
}'
curl -XGET 'http://localhost:9200/test_max_expansions/posts/_search?pretty' -d '{
"query": {
"filtered": {
"filter": { "term": { "hidden": true } },
"query": {
"match_phrase_prefix": {
"title": {
"query": "a"
}
}
}
}
}
}'
它返回0次点击,而如果我添加max_expansions: 1000
则返回我想要的文件
答案 0 :(得分:0)
我认为你需要使用Filtered Query: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html
您描述的行为听起来更像是后置过滤器: http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.x/search-request-post-filter.html
UPDATE 由于其他查询显然不是您的解决方案,因此我对此查询取得了一些成功。
GET /test_max_expansions/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase_prefix": {
"title": {
"query": "a1",
"max_expansions": 2
}
}
}
],
"must_not": [
{
"term": {
"hidden": {
"value": false
}
}
}
]
}
}
}
答案 1 :(得分:0)
我最终得到了这个,我找到的唯一方法是过滤小部分文档,然后对它们运行match_phrase_prefix:
curl -XGET 'http://localhost:9200/test_max_expansions/posts/_search?pretty' -d '{
"query": {
"filtered": {
"filter": {
"query": {
"match_phrase_prefix": {
"title": {
"query": "a"
}
}
}
},
"query": {
"term": { "hidden": true }
}
}
}
}'