ElasticSearch 多字段搜索查询
ElasticSearch MultiField Search Query
我有一个端点,我正在将其代理到 ElasticSearch API 以进行我正在进行的简单用户搜索。
/users?nickname=myUsername&email=myemail@gmail.com&name=John+Smith
这些参数的一些详细信息如下
- 所有参数都是可选的
- 昵称 可以作为全文搜索进行搜索(即 'myUser' 会 return 'myUsername')
- 电子邮件 必须完全匹配
- name 可以作为每个标记的全文搜索进行搜索(即 'john' 将 return 'John Smith')
ElasticSearch 搜索调用应将参数统一视为 AND'd。
现在,我不确定从哪里开始,因为我可以单独对每个参数执行查询,但不能一起执行查询。
client.search({
index: 'users',
type: 'user',
body: {
"query": {
//NEED TO FILL THIS IN
}
}
}).then(function(resp){
//Do something with search results
});
首先,您需要为此特定用例创建映射。
curl -X PUT "http://$hostname:9200/myindex/mytype/_mapping" -d '{
"mytype": {
"properties": {
"email": {
"type": "string",
"index": "not_analyzed"
},
"nickname": {
"type": "string"
},
"name": {
"type": "string"
}
}
}
}'
在这里,通过将电子邮件设为 not_analyzed ,您可以确保只有完全匹配才有效。
完成后,您需要进行查询。
由于我们有多个条件,使用 bool 查询是个好主意。
您可以组合多个查询以及如何使用 bool query
处理它们
查询 -
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "qbox"
}
},
{
"prefix": {
"nickname": "qbo"
}
},
{
"match": {
"email": "me@qbox.io"
}
}
]
}
}
}
使用前缀查询,您是在告诉 Elasticsearch,即使令牌以 qbo 开头,也将其作为匹配项。
此外,前缀查询可能不是很快,在这种情况下,您可以使用 ngram 分析器 - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html
我有一个端点,我正在将其代理到 ElasticSearch API 以进行我正在进行的简单用户搜索。
/users?nickname=myUsername&email=myemail@gmail.com&name=John+Smith
这些参数的一些详细信息如下
- 所有参数都是可选的
- 昵称 可以作为全文搜索进行搜索(即 'myUser' 会 return 'myUsername')
- 电子邮件 必须完全匹配
- name 可以作为每个标记的全文搜索进行搜索(即 'john' 将 return 'John Smith')
ElasticSearch 搜索调用应将参数统一视为 AND'd。
现在,我不确定从哪里开始,因为我可以单独对每个参数执行查询,但不能一起执行查询。
client.search({
index: 'users',
type: 'user',
body: {
"query": {
//NEED TO FILL THIS IN
}
}
}).then(function(resp){
//Do something with search results
});
首先,您需要为此特定用例创建映射。
curl -X PUT "http://$hostname:9200/myindex/mytype/_mapping" -d '{
"mytype": {
"properties": {
"email": {
"type": "string",
"index": "not_analyzed"
},
"nickname": {
"type": "string"
},
"name": {
"type": "string"
}
}
}
}'
在这里,通过将电子邮件设为 not_analyzed ,您可以确保只有完全匹配才有效。 完成后,您需要进行查询。 由于我们有多个条件,使用 bool 查询是个好主意。 您可以组合多个查询以及如何使用 bool query
处理它们查询 -
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "qbox"
}
},
{
"prefix": {
"nickname": "qbo"
}
},
{
"match": {
"email": "me@qbox.io"
}
}
]
}
}
}
使用前缀查询,您是在告诉 Elasticsearch,即使令牌以 qbo 开头,也将其作为匹配项。
此外,前缀查询可能不是很快,在这种情况下,您可以使用 ngram 分析器 - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html