如何 return 并在 DSE 搜索中按动态字段搜索
How to return and search by dynamic fields in DSE Search
我有一个简单的 Cassandra KF:
create table messages (
id varchar,
headers map<varchar, varchar>,
primary key (id));
table 获得一个 auto-generated Solr 索引。 headers
字段的值将接近您在电子邮件 header 中的预期值。我可以看到 Solr 为 headers 生成了以下行:
<dynamicField indexed="true" multiValued="false" name="headers*" stored="true" type="TextField"/>
但是,我无法在 header 中找到任何内容,也无法使用 Solr API 获取它们的值。一条记录:
cassandra@cqlsh:tpb> SELECT id, headers FROM messages;
1492cc10-046d-11e6-a332-55ae2575ea1a | {'component-count': '1', 'component-type-0': 'Document-Upload', 'consumer-behalf': 'true', 'date': 'Sun Apr 17 2016 00:22:02 GMT-0700 (PDT)', 'from': '718bcc80-9def-11e5-a837-0800200c9a66@1a4de124-5761-4668-9e9d-a880aa4e6dd1', 'message-id': '1492cc10-046d-11e6-a332-55ae2575ea1a@32d2a682-af07-4108-a15a-de6f8a75e811', 'to': '"mark-watney@cool-dude"@32d2a682-af07-4108-a15a-de6f8a75e811', 'transaction-id': '14585b20-046d-11e6-a332-55ae2575ea1a'}
运行 这两个查询永远不会 return 我任何 header 值(请注意任何 URL 编码为了可读性被反转):
...select?q=id:1492cc10-046d-11e6-a332-55ae2575ea1a&fl=id,headersconsumer-behalf&wt=json&indent=true
...select?q=id:1492cc10-046d-11e6-a332-55ae2575ea1a&fl=id,headers*&wt=json&indent=true
按 header 值搜索似乎也没有结果,例如
...select?q=headersdate:Sun&fl=id&wt=json&indent=true
...select?q=headersconsumer-behalf:true&fl=id&wt=json&indent=true
两个return个空集(但应该匹配上面的文档)。
感觉好像漏掉了什么,但又想不通是什么。 Solr 管理员报告 "headers*" 字段存在,并被正确索引等等。
那么,问题是:我如何 return 并在 DSE 中通过动态字段(从 Cassandra 映射推断)进行搜索?
您的 CQL 映射中的键需要在前面加上动态字段名称:
1492cc10-046d-11e6-a332-55ae2575ea1a | {'headerscount': '1', 'headerstype-0': 'Document-Upload',...
或
1492cc10-046d-11e6-a332-55ae2575ea1a | {'headerscomponent-count': '1', 'headerscomponent-type-0': 'Document-Upload',...
建议 CQL 中的地图名称采用“_”形式,以便您的动态字段看起来像:'headers_component-type-0'.
我有一个简单的 Cassandra KF:
create table messages (
id varchar,
headers map<varchar, varchar>,
primary key (id));
table 获得一个 auto-generated Solr 索引。 headers
字段的值将接近您在电子邮件 header 中的预期值。我可以看到 Solr 为 headers 生成了以下行:
<dynamicField indexed="true" multiValued="false" name="headers*" stored="true" type="TextField"/>
但是,我无法在 header 中找到任何内容,也无法使用 Solr API 获取它们的值。一条记录:
cassandra@cqlsh:tpb> SELECT id, headers FROM messages;
1492cc10-046d-11e6-a332-55ae2575ea1a | {'component-count': '1', 'component-type-0': 'Document-Upload', 'consumer-behalf': 'true', 'date': 'Sun Apr 17 2016 00:22:02 GMT-0700 (PDT)', 'from': '718bcc80-9def-11e5-a837-0800200c9a66@1a4de124-5761-4668-9e9d-a880aa4e6dd1', 'message-id': '1492cc10-046d-11e6-a332-55ae2575ea1a@32d2a682-af07-4108-a15a-de6f8a75e811', 'to': '"mark-watney@cool-dude"@32d2a682-af07-4108-a15a-de6f8a75e811', 'transaction-id': '14585b20-046d-11e6-a332-55ae2575ea1a'}
运行 这两个查询永远不会 return 我任何 header 值(请注意任何 URL 编码为了可读性被反转):
...select?q=id:1492cc10-046d-11e6-a332-55ae2575ea1a&fl=id,headersconsumer-behalf&wt=json&indent=true
...select?q=id:1492cc10-046d-11e6-a332-55ae2575ea1a&fl=id,headers*&wt=json&indent=true
按 header 值搜索似乎也没有结果,例如
...select?q=headersdate:Sun&fl=id&wt=json&indent=true ...select?q=headersconsumer-behalf:true&fl=id&wt=json&indent=true
两个return个空集(但应该匹配上面的文档)。
感觉好像漏掉了什么,但又想不通是什么。 Solr 管理员报告 "headers*" 字段存在,并被正确索引等等。
那么,问题是:我如何 return 并在 DSE 中通过动态字段(从 Cassandra 映射推断)进行搜索?
您的 CQL 映射中的键需要在前面加上动态字段名称:
1492cc10-046d-11e6-a332-55ae2575ea1a | {'headerscount': '1', 'headerstype-0': 'Document-Upload',...
或
1492cc10-046d-11e6-a332-55ae2575ea1a | {'headerscomponent-count': '1', 'headerscomponent-type-0': 'Document-Upload',...
建议 CQL 中的地图名称采用“_”形式,以便您的动态字段看起来像:'headers_component-type-0'.