当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch多字段搜索查询

黄淇
2023-03-14

我有一个endpoint,我正在将它代理到ElasticSearchAPI中,以进行简单的用户搜索。

/users?nickname=myUsername&email=myemail@gmail.com&name=John+Smith

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

  • 所有参数都是可选的
  • 昵称可以作为全文搜索进行搜索(即'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
});

共有1个答案

时才俊
2023-03-14

首先,您需要为这个特定用例创建映射。

curl -X PUT "http://$hostname:9200/myindex/mytype/_mapping" -d '{
  "mytype": {
    "properties": {
      "email": {
        "type": "string",
        "index": "not_analyzed"
      },
      "nickname": {
        "type": "string"
      },
      "name": {
        "type": "string"
      }
    }
  }
}'

在这里,通过不分析电子邮件,您可以确保只有完全匹配的邮件才有效。完成后,您需要进行查询。因为我们有多个条件,所以最好使用bool查询。您可以组合多个查询以及如何使用bool查询处理它们

质疑-

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "qbox"
          }
        },
        {
          "prefix": {
            "nickname": "qbo"
          }
        },
        {
          "match": {
            "email": "me@qbox.io"
          }
        }
      ]
    }
  }
}

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

此外,前缀查询可能不是很快,在这种情况下,您可以使用ngram analyzer-http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html

 类似资料:
  • 我需要在我的应用程序中添加搜索栏。搜索将按名和姓进行搜索。我不知道如何编写elastcsearch查询。名字和姓氏是两个分开的字段。我是个新手。 例:名:约翰,姓:约书亚 搜索栏字符串为上层结果:约翰·乔·约翰·乔·约翰·乔·乔·约翰·约书亚·约翰·约书亚·乔...

  • 问题内容: 我正在使用最新版本的elasticsearch-php以及最新版本的MongoDB和ElasticSearch。 我需要对可以包含一个或多个值的多个字段进行搜索。例: country_code应为NL,BE或DE,并且类别应包含AA01,BB01,CC02或ZZ11 我以为我会按照以下方式解决它(PHP): 但是结果甚至还不能接近我期望返回的数据。 有时 $ countries 和/或

  • 我配置了一个带有两个字段的Elasticsearch索引:“name”和“type”。当我执行下面的查询时,没有得到任何结果,因为“actor”在“type”字段中。 有没有任何方法可以执行一个包含多个单词的查询,并且即使一些单词在“name”字段中而其他单词在“type”字段中也可以得到结果。 谢谢你的帮助!

  • 问题内容: 我想基于(不是)使用新文档更新此文档。 像这样: elasticsearch版本:6.2,ES Java API:6.2 问题答案: 您基本上可以使用查询API更新来实现所需的功能,基本上是这样的: 更新:使用Java API 有关使用UpdateByQuery Java API 和Java高级Rest 客户端的更多详细信息

  • 我试图在ElasticSearch中运行类似的字段查询:

  • 如何告诉Elasticsearch在按术语搜索时排除某个字段? 当一个普通用户搜索摩托车时,什么都不应该返回,但如果他们搜索史密斯,这两个都应该返回。 有能力搜索认证字段的用户如果搜索摩托车将返回标记,如果搜索史密斯将返回标记。