我将数据存储在像这样的弹性索引中
{'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
{
"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条记录?
答案 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
}
}
]
}
}
}
}