我在ElasticSearch 1.0.1上,使用NEST和直接HTTP进行查询/测试。
我有这样的文档:
{ "_index": "orders_staging",
"_type": "order",
"_id": "1721",
"_score": 1,
"_source": {
"dbId": 1721,
"id": "a0f4012b0351",
"sourceId": "__micah",
"partnerId": 7,
"partnerName": "__Test34",
"paymentMethodId": 1,
"shippingAddress": {
"addressId": 1553,
"firstName": "Micah",
"lastName": "Smith",
"line1": "",
"line2": "",
"city": "Pittsburgh",
"state": "PA",
"countryCode": "US",
"postalCode": "15201",
"phone": "5551212",
"email": "micah@me.com"
},
"dateCreated": "2012-10-24T15:11:10.193"
}
}
当我运行以下过滤器时:
GET orders_staging/order/_search
{
"from": 0,
"size": 25,
"filter": {
"or":{
"filters": [
{
"nested": {
"path": "shippingAddress",
"query": {
"term":{
"shippingAddress.email":{
"value":"micah"
}
}
}
}
}
]
}
}
}
可行,但如果我使用完整的电子邮件micah@me.com
,则会失败。
似乎任何带有@
符号的内容都会失败。
有什么想法吗? Term
是否无法匹配电子邮件?我试过逃避它,但没有运气(无论如何都是一个POST)。
答案 0 :(得分:3)
这样做的一个可能原因是您的电子邮件地址可能在编制索引时被标记化。所以代替micah@me.com有三个代币(术语):micah,me,com。如果是这种情况,请尝试将"index": "not_analyzed"
添加到其映射定义中。
答案 1 :(得分:3)
您应该使用UAX电子邮件URL Tokenizer。来自文档:
UAX电子邮件网址标记符
类型为uax_url_email的标记化器,其工作方式与 标准的标记化程序,但将电子邮件和网址标记为单个标记。
它将电子邮件地址标记为单个令牌,设施电子邮件地址搜索。
以下是适当的索引设置和映射以及Github上示例代码链接的一个不错的示例:
{
"settings" : {
"index": {
"analysis" :{
"analyzer": {
"default": {
"type" : "custom",
"tokenizer" : "uax_url_email",
"filter" : ["standard", "lowercase", "stop"]
}
}
}
}
}
}
https://github.com/imotov/elasticsearch-test-scripts/blob/master/email_default_analyzer.sh
答案 2 :(得分:0)
您使用的是映射吗?如果是这样,shippingaddres.email是字符串还是文本字段?如果它是文本,我的猜测是该字段可能被标记化。如果要始终匹配确切的地址,请尝试将字段映射为字符串字段