Elasticsearch 批量或搜索
Elasticsearch bulk or search
背景
我正在开发一个 API 允许用户传递有关成员的详细信息列表(姓名、电子邮件地址...)我想使用此信息来匹配帐户我的 Elasticsearch 数据库中的记录和 return 潜在匹配列表。
我认为这就像在我想要的字段上进行 bool 查询一样简单,但是我似乎没有得到任何结果。
我对 Elasticsearch 比较陌生,我当前的 _search 请求如下所示。
示例查询
POST /member/account/_search
{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"should" [{
"term" : {
"email": "jon.smith@gmail.com"
}
},{
"term" : {
"email": "samy@gmail.com"
}
},{
"term" : {
"email": "bo.blog@gmail.com"
}
}]
}
}
}
}
}
问题
我应该如何将此查询更新为 return 匹配任何电子邮件地址的记录?
我能否优先考虑匹配电子邮件和其他字段的记录?示例 "family_name".
如果我需要对几百个电子邮件地址执行此操作,这会成为问题吗?
嗯,您需要在索引端而不是查询端进行更改。
默认情况下,您的电子邮件 ID 被分解为
jon.smith@gmail.com => [乔恩、史密斯、gmail、com]
正在编制索引。
现在,当您使用词条查询进行搜索时,它不会应用分析器,而是会尝试获得 jon.smith@gmail.com 的精确匹配,如您所见,这是行不通的。
即使您使用 match query ,您最终也会将所有文档作为匹配项。
因此,您需要更改映射以将电子邮件 ID 索引为单个标记,而不是将其标记化。
所以使用 not_analyzed 将是这里最好的解决方案。
当您将电子邮件字段定义为 not_analyzed 时,索引时会发生以下情况。
jon.smith@gmail.com => [jon.smith@gmail.com]
更改所有文档的映射和索引后,现在您可以自由运行上述查询。
我建议使用如下术语查询 -
{
"query": {
"terms": {
"email": [
"jon.smith@gmail.com",
"samy@gmail.com",
"bo.blog@gmail.com"
]
}
}
}
回答你问题的第二部分 - 你正在寻找提升并建议通过 function score query
背景
我正在开发一个 API 允许用户传递有关成员的详细信息列表(姓名、电子邮件地址...)我想使用此信息来匹配帐户我的 Elasticsearch 数据库中的记录和 return 潜在匹配列表。
我认为这就像在我想要的字段上进行 bool 查询一样简单,但是我似乎没有得到任何结果。
我对 Elasticsearch 比较陌生,我当前的 _search 请求如下所示。
示例查询
POST /member/account/_search
{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"should" [{
"term" : {
"email": "jon.smith@gmail.com"
}
},{
"term" : {
"email": "samy@gmail.com"
}
},{
"term" : {
"email": "bo.blog@gmail.com"
}
}]
}
}
}
}
}
问题
我应该如何将此查询更新为 return 匹配任何电子邮件地址的记录?
我能否优先考虑匹配电子邮件和其他字段的记录?示例 "family_name".
如果我需要对几百个电子邮件地址执行此操作,这会成为问题吗?
嗯,您需要在索引端而不是查询端进行更改。
默认情况下,您的电子邮件 ID 被分解为 jon.smith@gmail.com => [乔恩、史密斯、gmail、com]
正在编制索引。
现在,当您使用词条查询进行搜索时,它不会应用分析器,而是会尝试获得 jon.smith@gmail.com 的精确匹配,如您所见,这是行不通的。 即使您使用 match query ,您最终也会将所有文档作为匹配项。 因此,您需要更改映射以将电子邮件 ID 索引为单个标记,而不是将其标记化。 所以使用 not_analyzed 将是这里最好的解决方案。 当您将电子邮件字段定义为 not_analyzed 时,索引时会发生以下情况。 jon.smith@gmail.com => [jon.smith@gmail.com]
更改所有文档的映射和索引后,现在您可以自由运行上述查询。
我建议使用如下术语查询 -
{
"query": {
"terms": {
"email": [
"jon.smith@gmail.com",
"samy@gmail.com",
"bo.blog@gmail.com"
]
}
}
}
回答你问题的第二部分 - 你正在寻找提升并建议通过 function score query