我正在使用ES 1.7,试图match_phrase使用完全匹配字符串来搜索文档。单独使用时,过滤器可以正常工作,但是当我组合使用过滤器时,会出现错误。
match_phrase
例如:人员文档 q=aaron&address=scarborough-通过姓名和地址搜索人员,效果很好。
q=aaron&address=scarborough
{ "query": { "match_phrase": { "name": "aaron" } }, "filter": { "bool": { "must": { "nested": { "path": "addresses", "query": { "match_phrase": { "address": "scarborough" } } } } } },
q=aaron&phone=813-689-6889 -通过姓名和电话号码搜索人也可以。
q=aaron&phone=813-689-6889
{ "query": { "match_phrase": { "name": "aaron" } }, "filter": { "bool": { "must": { "query": { "match_phrase": { "phone": "813-689-6889" } } } } }
但是,当我尝试同时使用过滤器,地址和电话时,出现No filter registered for [match_phrase]错误
No filter registered for [match_phrase]
例如: q=aaron&address=scarborough&phone=813-689-6889
q=aaron&address=scarborough&phone=813-689-6889
{ "query": { "match_phrase": { "name": "aaron" } }, "filter": { "bool": { "must": { "nested": { "path": "addresses", "query": { "match_phrase": { "address": "scarborough" } } }, "query": { "match_phrase": { "phone": "813-689-6889" } } } } }
一起使用address和phone过滤器时出现错误:
address
phone
nested: QueryParsingException[[pl_people] No filter registered for [match_phrase]]; }]","status":400}):
索引映射(人):
{ "pl_people": { "mappings": { "person": { "properties": { "ac_name": { "type": "string", "analyzer": "autocomplete" }, "addresses": { "type": "nested", "properties": { "address": { "type": "string" }, "city": { "type": "string", "index": "not_analyzed" }, "city_id": { "type": "long" }, "country": { "type": "string", "index": "not_analyzed" }, "county": { "type": "string", "index": "not_analyzed" }, "county_id": { "type": "long" }, "id": { "type": "long" }, "location": { "type": "geo_point" }, "parameterized": { "type": "string" }, "state": { "type": "string", "index": "not_analyzed" }, "state_id": { "type": "long" }, "zip": { "type": "string", "index": "not_analyzed" } } }, "author": { "type": "string", "index": "not_analyzed" }, "body": { "type": "string", "analyzer": "remove_html", "fields": { "ns_body": { "type": "string", "analyzer": "remove_html_stopwords" } } }, "charities": { "type": "nested", "properties": { "email": { "type": "string", "index": "not_analyzed" }, "id": { "type": "long" } } }, "community": { "properties": { "name": { "type": "string", "index": "not_analyzed" }, "parameterized": { "type": "string", "index": "not_analyzed" }, "slug": { "type": "string", "index": "not_analyzed" } } }, "created_at": { "type": "date", "format": "dateOptionalTime" }, "date_of_birth": { "type": "date", "format": "dateOptionalTime" }, "delimiters": { "type": "nested", "properties": { "delimiter_type": { "type": "string", "index": "not_analyzed" }, "id": { "type": "long" } } }, "description": { "type": "string" }, "employments": { "type": "nested", "properties": { "email": { "type": "string", "index": "not_analyzed" }, "employment_status": { "type": "string", "index": "not_analyzed" }, "foia_contact": { "type": "boolean" }, "id": { "type": "long" }, "phone": { "type": "string", "index": "not_analyzed" }, "phone_extension": { "type": "string", "index": "not_analyzed" } } }, "first_name": { "type": "string", "fields": { "na_first_name": { "type": "string", "index": "not_analyzed" } } }, "last_name": { "type": "string", "fields": { "na_last_name": { "type": "string", "index": "not_analyzed" } } }, "market": { "properties": { "name": { "type": "string", "index": "not_analyzed" }, "parameterized": { "type": "string", "index": "not_analyzed" }, "slug": { "type": "string", "index": "not_analyzed" } } }, "middle_name": { "type": "string", "fields": { "na_middle_name": { "type": "string", "index": "not_analyzed" } } }, "most_recent_organization": { "properties": { "description": { "type": "string" }, "id": { "type": "long" }, "name": { "type": "string" }, "parameterized": { "type": "string" }, "phone": { "type": "string" } } }, "name": { "type": "string", "fields": { "na_name": { "type": "string", "index": "not_analyzed" }, "ngram_name": { "type": "string", "analyzer": "my_start" }, "ns_name": { "type": "string", "analyzer": "no_stopwords" } } }, "organizations": { "properties": { "name": { "type": "string" }, "parameterized": { "type": "string", "index": "not_analyzed" } } }, "package": { "properties": { "name": { "type": "string", "index": "not_analyzed" }, "parameterized": { "type": "string", "index": "not_analyzed" }, "slug": { "type": "string", "index": "not_analyzed" } } }, "parameterized": { "type": "string", "index": "not_analyzed" }, "phone": { "type": "string" }, "photo": { "properties": { "large": { "type": "string" }, "medium": { "type": "string" }, "teaser": { "type": "string" }, "thumb": { "type": "string" }, "url": { "type": "string" } } }, "projects": { "properties": { "id": { "type": "long" }, "name": { "type": "string", "index": "not_analyzed" }, "parameterized": { "type": "string", "index": "not_analyzed" }, "slug": { "type": "string", "index": "not_analyzed" } } }, "public_offices": { "type": "nested", "properties": { "email": { "type": "string", "index": "not_analyzed" }, "employment_status": { "type": "string", "index": "not_analyzed" }, "id": { "type": "long" } } }, "published": { "type": "string", "index": "not_analyzed" }, "region": { "properties": { "name": { "type": "string", "index": "not_analyzed" }, "parameterized": { "type": "string", "index": "not_analyzed" }, "slug": { "type": "string", "index": "not_analyzed" } } }, "resource": { "type": "string" }, "short_description": { "type": "string" }, "show_path": { "type": "string" }, "time": { "type": "date", "format": "dateOptionalTime" }, "updated_at": { "type": "date", "format": "dateOptionalTime" } } } } } }
我用来测试的文件
[ { "_index": "pl_people", "_type": "person", "_id": "813106", "_score": null, "sort": [ -9223372036854775808 ], "resource": "Person", "parameterized": "813106-aaron-mcguire", "created_at": "2011-10-29T19:51:24.000-05:00", "updated_at": "2014-12-11T07:21:08.000-06:00", "name": "Aaron McGuire", "title": null, "photo": { "url": "/assets/140x140.gif" }, "description": null, "short_description": null, "time": "2014-12-11", "show_path": "/people/813106-aaron-mcguire", "published": true, "aliases": [], "phone": "813-689-6889", "date_of_birth": "1991-03-01", "first_name": "Aaron", "middle_name": "", "last_name": "McGuire", "delimiters": [], "market": null, "region": null, "most_recent_organization": null, "households": [], "court_cases": [], "addresses": [ { "id": 1, "parameterized": "1", "address": "123 Scarborough road", "zip": "L5A2A9", "city": "Ontario", "country": "USA", "state": "California", "location": null, "state_id": null, "county_id": null, "city_id": null } ], "projects": [], "voter_ids": [], "id": "813106" } ]
最终,我能够重现该问题,"include_in_parent":true,因为您遇到了我在评论中提到的错误,因此看起来好像在映射中错过了。。
"include_in_parent":true,
为了解决此问题,我使用了相同的映射为您提供,但"include_in_parent": true,在address嵌套字段的顶级添加了该问题。为简便起见,仅提供address部分修改的映射。
"include_in_parent": true,
"addresses": { "type": "nested", "include_in_parent": true, --> added only this in your mapping. "properties": { "address": { "type": "string" }, "city": { "type": "string", "index": "not_analyzed" }, "city_id": { "type": "long" }, "country": { "type": "string", "index": "not_analyzed" }, "county": { "type": "string", "index": "not_analyzed" }, "county_id": { "type": "long" }, "id": { "type": "long" }, "location": { "type": "geo_point" }, "parameterized": { "type": "string" }, "state": { "type": "string", "index": "not_analyzed" }, "state_id": { "type": "long" }, "zip": { "type": "string", "index": "not_analyzed" } } }
之后收录一些样本文档,其中有不同的价值观address和namePARAM,以验证我的搜索查询的一个正确的结果。
name
最后的搜索查询包括两个过滤器,请注意,我删除 了父文档中包含的地址字段中 的 嵌套部分,因此您现在就可以直接对其进行查询。 该查询看起来非常简单,现在可以提供预期的结果。
{ "query": { "match_phrase": { "name": "aaron" } }, "filter": { "bool": { "must": [{ "query": { "match_phrase": { "address": "scarborough" } } }, { "query": { "match_phrase": { "phone": "813-689-6889" } } }] } } }
"hits": [ { "_index": "so-match-phrase", "_type": "pl_people", "_id": "4", "_score": 0.19178301, "_source": { "resource": "Person", "parameterized": "813106-aaron-mcguire", "created_at": "2011-10-29T19:51:24.000-05:00", "updated_at": "2014-12-11T07:21:08.000-06:00", "name": "aaron McGuire", "title": null, "photo": { "url": "/assets/140x140.gif" }, "description": null, "short_description": null, "time": "2014-12-11", "show_path": "/people/813106-aaron-mcguire", "published": true, "aliases": [], "phone": "813-689-6889", "date_of_birth": "1991-03-01", "first_name": "Aaron", "middle_name": "", "last_name": "McGuire", "delimiters": [], "market": null, "region": null, "most_recent_organization": null, "households": [], "court_cases": [], "addresses": [ { "id": 1, "parameterized": "1", "address": "Scarborough road", "zip": "L5A2A9", "city": "Ontario", "country": "USA", "state": "California", "location": null, "state_id": null, "county_id": null, "city_id": null } ], "id": "813106" } }, { "_index": "so-match-phrase", "_type": "pl_people", "_id": "1", "_score": 0.19178301, "_source": { "resource": "Person", "parameterized": "813106-aaron-mcguire", "created_at": "2011-10-29T19:51:24.000-05:00", "updated_at": "2014-12-11T07:21:08.000-06:00", "name": "Aaron McGuire", "title": null, "photo": { "url": "/assets/140x140.gif" }, "description": null, "short_description": null, "time": "2014-12-11", "show_path": "/people/813106-aaron-mcguire", "published": true, "aliases": [], "phone": "813-689-6889", "date_of_birth": "1991-03-01", "first_name": "Aaron", "middle_name": "", "last_name": "McGuire", "delimiters": [], "market": null, "region": null, "most_recent_organization": null, "households": [], "court_cases": [], "addresses": [ { "id": 1, "parameterized": "1", "address": "123 Scarborough road", "zip": "L5A2A9", "city": "Ontario", "country": "USA", "state": "California", "location": null, "state_id": null, "county_id": null, "city_id": null } ], "id": "813106" } } ]