Table of Contents
Goals:
- Improve Metadata Search: This requires redesign of how we store metadata. Design proposed below.
- Make search for tags work for all the tags in the list
- Support tokenized search where user can search with any word from the value
- Schema Search:
- CDAP Schema for Datasets, Streams and Views should be stored as metadata and searchable through fieldname or and fieldname with fieldtype (only for primitive fieldtype)
- Search filtering based on entity type.
...
- User stories documented (Rohit/Poorna)
- User stories reviewed (Nitin)
- Design documented (Rohit/Poorna)
- Design reviewed (Andreas)
- Feature merged (Rohit)
- Examples and guides (Rohit)
- Integration tests (Rohit)
- Documentation for feature (Rohit)
- Blog post
...
- Key Value Metadata Search
- User should be able to search with key-value or its prefix
- User should be able to search with key and part of value or individual word in value or its prefix
- User should be able to search with just value or its prefix
- User should be able to search with individual words in the value
- Tag Metadata Search
- User should be able to search with tags key and a tag value or its prefix
- User should be able to search with just a tag value or its prefix.
- Schema Search:
- User should be able search with fieldname or its prefix
- User should be able to search with fieldname or its prefix scoped just to schema
- User should be able to search with fieldname and fieldtype (only for primitive types)
- Search Filtering:
- User should be able to filter searches to a particular entity type for example app, program, dataset
- Partial Searching:
- User should be able to see result for individual words in search query.
Design
Search Query Examples:
- User stores a key-value metadata with key = "Codename" and value = "Alpha Tango Charlie" for an entity
- User can retrieve this entity with the following queries:
- key-value
- Codename: Alpha Tango Charlie
- Codename: Alpha Tang*
- key with part of value
- Codename: Alpha
- Codename: Tango
- Codename: Charlie
- Codename: Alp*
- value
- Alpha Tango Charlie
- Alpha*
- Alpha Tan*
Note:- We have decided not to support searches for queries which have parts of value for example "Tango Charlie". You can either search for whole value or with prefix or single words (we plan to tokenize on whitespace)
- parts of Individual word in value
- Alpha
- Tango
- Charlie
- Alph*
- Tan*
- Ch*
- key-value
- Not supported:
- key* i.e. Codename*
- User can retrieve this entity with the following queries:
- User tags an entity with the following tags "Tag1, Tag22"
- User can retrieve this entity with the following queries:
- tag key and a tag value:
- tags: Tag1
- tags: Tag*
- a tag value
- tag22
- tag2*
- tag key and a tag value:
- User can retrieve this entity with the following queries:
A dataset has the following schema:
Code Block title Nested Schema { "EmpName": "String", "EmpContact": { "EmpTel": "Integer", "EmpAddr": "String" } }
User can retrieve this dataset entity with the following queries:
- fieldname:
- EmpName
- EmpContact
- EmpTel
- EmpAddr
- Emp*
- fieldname scoped to schema:
- schema: EmpName
- schema: EmpContact
- schema: EmpTel
- schema: EmpAddr
- schema: Emp*
- fieldname with fieldtype (only for primitive types)
- EmpName:String (only for java primitive types)
- EmpName:String (only for java primitive types)
- We don't plan to support schema searches with complex fieldType. If a user searched with a query which is not scoped with schema by default it will search for schema fields besides the normal key-value and tags.
Open questions:- What if an entity has multiple schema (ex: transform which has input and output schema)
- We will index both schema (After discussion with Nitin)
- How will an user search for a fieldName across input and output schema ?
- We do not support searches limited to input/output or just one schema (After discussion with Nitin)
- What if an entity has multiple schema (ex: transform which has input and output schema)
- fieldname:
- Search Filtering:
- User wants to search only for 'dataset'
- dataset: Codename: Alpha
- dataset: tags: Tag1
- dataset: schema: EmpName
Note: if not entity type is specified we will return all matched entities.
- User wants to search only for 'dataset'
- Partial Searching:
- User searches for "California USA" : Separate every search query on white space and search for every single word (or)
Search result will contain:- All entities tagged with "California USA" followed by
- All entities tagged with "California" followed by
- All entities tagged with "USA"
- User searches for "California USA" : Separate every search query on white space and search for every single word (or)
Storage:
We are going to use the IndexedTable which we are using currently too. In the new storage design we will have two rows:
...
Metadata Search Results:
- CDAP-4274 - Metadata search should returns the metadata of matching entities ( Open)
- Also return some other relevant info. Please see details below.
Search Result
Metadata search will return Entities with the following details depending upon the type of the Entity. The search results will be order descending on basis of entity creation time.
Entity Type Search Details Application Type
Name Matched Metadata (Snippet) with all system metadata App Description Entity creation time Program Type Name Matched Metadata (Snippet) with all system metadata App it belongs to Entity creation time Artifact Type Name Matched Metadata (Snippet) with all system metadata Entity creation time Dataset Type Name Matched Metadata (Snippet) with all system metadata Entity creation time Stream Name Type Matched Metadata (Snippet) with all system metadata Entity creation time View Name Type Matched Metadata (Snippet) with all system metadata Stream Name Entity creation time Design Decision:
- In the search result of entity we will return the matched metadata with all the system metadata for that entity too.
Open Question:
- Please suggest other things which we can add to different search result entities ?
Emit more metadata from system entities:
...
- Invalidate just * query
- Support Pagination of search result in backend
- User entity creation time for ordering of search result
- Support searched with stemming (workflow/workflows) : Porter Stemming
- Support and (&) operation: Example search query - app:appname & program