弹性搜索查找多个精确值查询

时间:2016-01-05 14:39:03

标签: elasticsearch

我将数据存储在像这样的弹性索引中

{'name': 'Arnie Metz PhD', 'user_id': 'CL_000960', 'email_id': 'streich.anjelica@gmail.com', 'customer_id': 'CL_2135514566_1427476813'}
{'name': 'Ms. Princess Bernhard', 'user_id': 'CL_000972', 'email_id': 'obatz@yahoo.com', 'customer_id': 'CL_2135514566_1427476810'}
{'name': "Lori O'Kon", 'user_id': 'CL_000980', 'email_id': 'murl86@schmidt.com', 'customer_id': 'CL_2135514566_1427476811'}
{'name': "Ahmad O'Reilly", 'user_id': 'CL_000981', 'email_id': 'kassie95@yahoo.com', 'customer_id': 'CL_2135514566_1427476815'}
{'name': 'Lovell Connelly', 'user_id': 'CL_000982', 'email_id': 'wweimann@mclaughlincorwin.com', 'customer_id': 'CL_2135514566_1427476815'}
{'name': 'Errol Feest', 'user_id': 'CL_000989', 'email_id': 'cordella30@yahoo.com', 'customer_id': 'CL_2135514566_1427476810'}
{'name': "May O'Conner", 'user_id': 'CL_000990', 'email_id': 'iverson51@gmail.com', 'customer_id': 'CL_2135514566_1427476815'}
{'name': 'Virgie Wyman', 'user_id': 'CL_000999', 'email_id': 'florine.jenkins@yahoo.com', 'customer_id': 'CL_2135514566_1427476812'}
{'name': 'Ofelia McClure', 'user_id': 'CL_0001001', 'email_id': 'fidelia.hilll@mayert.com', 'customer_id': 'CL_2135514566_1427476814'}
{'name': 'Mr. Edson Rosenbaum Jr.', 'user_id': 'CL_0001003', 'email_id': 'mkerluke@hotmail.com', 'customer_id': 'CL_2135514566_1427476810'}

我想从查询中获得的是使用以下查询从user_ids列表中的电子邮件ID列表

  

查询1

根据Elastic Doc

{
  "query" : {
    "filtered" : {
        "filter" : {
            "terms" : {
                "user_id" : ["CL_0004430", "CL_0004496"]
            }
        }
     }
   }
 }

这不是结果。它给出了空结果

  

查询2

{
 "query": {
   "bool": {
     "must": [
      {
        "match": {
          "user_id": {
          "query": "['CL_00078','CL_00028']",
          "operator": "or"
          }
        }
      }
    ]
  }
 },
 "aggs": {}
}

这是按预期工作但问题是条件参数的限制。我不能在列表中发送超过1000封电子邮件。

查询是否有更好的方法可以在查询中获得超过10000条记录?

2 个答案:

答案 0 :(得分:3)

这是一个非常好的问题。在存储用户ID之类的内容时,通常最好将其设置为“未分析”。'这样,当您对它们进行精确搜索时,您将获得预期的结果。使用以下映射时,您的术语查询按预期工作:

POST test_users
{
  "mappings" :{
    "test_user":{
      "properties": {
        "name": { "type": "string" },
        "user_id": {"type": "string", "index": "not_analyzed"},
        "email_id": {"type": "string", "fields": { "raw": { "type": "string", "index": "not_analyzed" }}},
        "customer_id": { "type": "string", "index": "not_analyzed"}
      }
    }
  }
}

POST _bulk
{"create": {"_index": "test_users", "_type": "test_user" }}
{"name": "Arnie Metz PhD", "user_id": "CL_000960", "email_id": "streich.anjelica@gmail.com", "customer_id": "CL_2135514566_1427476813"}
{"create": {"_index": "test_users", "_type": "test_user" }}
{"name": "Ms. Princess Bernhard", "user_id": "CL_000972", "email_id": "obatz@yahoo.com", "customer_id": "CL_2135514566_1427476810"}

# returns two results.
GET test_users/test_user/_search
{
 "query": {
    "filtered" : {
      "filter" : {
        "terms": {
          "user_id": ["CL_000960","CL_000972"]
        }
      }
    }
  }
}

您需要做的另一件事是在elasticsearch.yml配置文件中设置index.query.bool.max_clause_count: 12000(或其他一些大数字),然后重新启动您的实例。否则,您将获得TooManyClauses[maxClauseCount is set to 1024];

在尝试使用我自己的ElasticSearch实例后,在一个术语数组中传递10,000个项目大约需要1.5秒才能返回每组25个结果。这是在桌面工作站上运行的单个节点,具有4核,3.40 GHz处理器和8 GB RAM。因此,您可能需要考虑扫描和滚动类型查询。

答案 1 :(得分:0)

你试过filter or了吗? (我不知道是否有限制,但发送一个长查询可能会很慢发送一些低速连接)

{
    "query" : {
        "filtered" : {
            "filter" : {
                "or" : [{
                        "term" : {
                            "user_id" : "CL_0004430",
                            "_cache" : false
                        }
                    }, {
                        "term" : {
                            "user_id" : "CL_0004496",
                            "_cache" : false
                        }
                    }
                ]
            }
        }
    }
}