过滤然后查询

时间:2014-03-11 20:11:14

标签: lucene elasticsearch

我有一个包含数千个文档的索引(比如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则返回我想要的文件

2 个答案:

答案 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 }
            }
        }
    }
}'