如何 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'.