ElasticSearch MultiField搜索查询

The*_*boy 0 mongoose mongodb node.js elasticsearch elasticsearch-plugin

我有一个端点,我正在代理ElasticSearch API,用于我正在进行的简单用户搜索.

/users?nickname=myUsername&email=myemail@gmail.com&name=John+Smith
Run Code Online (Sandbox Code Playgroud)

Somet有关这些参数的详细信息如下

  • 所有参数都是可选的
  • 昵称可以作为全文搜索进行搜索(即'myUser'将返回'myUsername')
  • 电子邮件必须完全匹配
  • 可以搜索名称作为每个标记的全文搜索(即'john'将返回'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
});
Run Code Online (Sandbox Code Playgroud)

Vin*_*han 5

首先,您需要为此特定用例创建映射.

curl -X PUT "http://$hostname:9200/myindex/mytype/_mapping" -d '{
  "mytype": {
    "properties": {
      "email": {
        "type": "string",
        "index": "not_analyzed"
      },
      "nickname": {
        "type": "string"
      },
      "name": {
        "type": "string"
      }
    }
  }
}'
Run Code Online (Sandbox Code Playgroud)

通过将电子邮件设为not_analyzed,您确保只有完全匹配才有效.完成后,您需要进行查询.由于我们有多个条件,因此使用bool查询是个好主意.您可以组合多个查询以及如何使用bool查询处理它们

查询 -

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "qbox"
          }
        },
        {
          "prefix": {
            "nickname": "qbo"
          }
        },
        {
          "match": {
            "email": "me@qbox.io"
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

使用前缀查询,您告诉Elasticsearch即使令牌以qbo开头,也将其限定为匹配.

前缀查询也可能不是很快,在这种情况下你可以去ngram分析器 - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html