数据建模技巧
编辑数据建模技巧
编辑使用结构化和非结构化字段
编辑注释通常是将结构化信息编织到非结构化文本中以实现更高精度搜索的一种方式。
实体解析
是一种由专业软件或人员进行的文档增强形式,其中通过附加规范 ID 来消除文档中对实体的引用歧义。该 ID 用于解析任意数量的别名或区分同名的人。连接维基百科文章的超链接是编织到文本中的已解析实体 ID 的一个很好的例子。
这些 ID 可以作为注释嵌入到 annotated_text 字段中,但通常将它们包含在专用的结构化字段中以支持通过聚合进行发现更有意义
PUT my-index-000001 { "mappings": { "properties": { "my_unstructured_text_field": { "type": "annotated_text" }, "my_structured_people_field": { "type": "text", "fields": { "keyword" : { "type": "keyword" } } } } } }
然后,应用程序通常会提供内容并按如下方式发现它
# Example documents PUT my-index-000001/_doc/1 { "my_unstructured_text_field": "[Shay](%40kimchy) created elasticsearch", "my_twitter_handles": ["@kimchy"] } GET my-index-000001/_search { "query": { "query_string": { "query": "elasticsearch OR logstash OR kibana", "default_field": "my_unstructured_text_field" } }, "aggregations": { "top_people" :{ "significant_terms" : { "field" : "my_twitter_handles.keyword" } } } }
避免过度匹配注释
编辑按照设计,常规文本标记和注释标记共存于同一索引字段中,但在极少数情况下,这可能会导致一些过度匹配。
注释的值通常表示一个命名实体(人、地点或公司)。这些命名实体的标记是未分词插入的,并且与典型的文本标记不同,因为它们通常是
- 大小写混合,例如
Madonna
- 多个单词,例如
Jeff Beck
- 可以包含标点符号或数字,例如
Apple Inc.
或@kimchy
这意味着,在大多数情况下,在注释文本字段中搜索命名实体不会有任何误报,例如,当从聚合结果中选择 Apple Inc.
时,您可以向下钻取以突出显示文本中的用法,而不会在此上下文中“过度匹配”任何文本标记,例如单词 apple
the apple was very juicy
但是,如果您的命名实体恰好是一个单项且小写,例如公司 elastic
,就会出现问题。在这种情况下,在注释文本字段中搜索标记 elastic
可能会匹配如下文本文档
they fired an elastic band
为避免此类错误匹配,用户应考虑为注释值添加前缀,以确保它们不会与文本标记名称冲突,例如
[elastic](Company_elastic) released version 7.0 of the elastic stack today