SlideShare a Scribd company logo
1 of 94
Tagging search solution design
Advanced edition
Tokarev Alexander
DataArt
RuOUG
Agenda
• Intro
• Database challenges
• Architecture patterns
• Data structure patterns
• Faceted navigation
• Our case
• Conclusion
• Q&A session
Tagging
• Keyword assigned to an object
• Chosen informally and personally by item's creator or viewer
• Assigned by the viewer + unlimited = Folksonomy
• Assigned by the creator + limited = Taxonomy
Tagging UI
Tagging UI
Tagging UI
Tagging UI
AND OR
Pros
1. Reflects the user’s vocabulary directly
2. Flexibility
3. Multi-dimensional nature
Cons
1. Misspellings, singular/plural form, compound
2. Ambiguous, over-personalized, poorly applied
3. Synonyms
Challenges
1. Performance
2. Queries awkwardness
3. Database size
4. Housekeeping
Developer life path
Maturity modelPenguin Maturity Model
Architecture patterns
RDBMS + SQL
Full Text Search server
+
server language
Test data
Source: http://data.stackexchange.com/stackoverflow
Extracted entities: Posts, Tags, PostsTags
Date: from 2008 to 2012
Posts: 3 000 000
Applied tags: 8 000 000
Unique tags count: 30 000
Max tags count for a post: 5
Max tag length: 30
Hardware: VirtualBox, 4 Virtual core 2,6 Ghz, 4 Gb memory, Oracle memory target 1 Gb
Test data
Stackoverflow tricks
Data structure patterns
Data structure patterns
Data structure patterns
Oracle nested tables
Oracle nested tables
No data returned
Oracle nested tables
Oracle nested tables
Oracle Nested tables 2
Oracle VARRAY storage
Oracle VARRAY indexing
Postgres nested tables
Postgres nested tables
Postgres nested tables
Postgres nested tables
…………
moves field values out-of-line
…………
wider than TOAST_TUPLE_THRESHOLD bytes (normally 2 kB)
…………
in a chunk which stored as a separate row in the TOAST table belonging to the owning table
Postgres nested tables GIN index
Data structure patterns
• Stackoverflow: <php><mysql><guid><encryption>
• JSON: {“tags”:[“php”, “apache2”, “openinviter”]}
Ingestion
0 500 1000 1500 2000 2500
Relational
Denormalized
Complex data type
Full text search
Insert time, seconds
Database size
0 200 400 600 800 1000 1200 1400
Relational
Denormalized
Complex data type
Full text search
Volume
Index size, MB Data size, MB Size total, MB
Search by Id, document retrieval
Search by Id, tag list retrieval
0 0.0005 0.001 0.0015 0.002 0.0025 0.003 0.0035
Relational
Denormalized
Complex data type
Full text search
Speed with hot cache, seconds
Search by a single tag, tag list retrieval
Search by a single tag, tag list retrieval
Search by a single tag, tag list retrieval
0 0.001 0.002 0.003 0.004 0.005 0.006
Relational
Denormalized
Complex data type
Full text search
Speed with hot cache, seconds
Search by multiple tags, tag list retrieval
Too
much
SQL
Search by multiple tags, tag list retrieval
Search by multiple tags, tag list retrieval
Search by multiple tags, tag list retrieval
Search by multiple tags, tag list retrieval
Search by multiple tags, tag list retrieval
0 0.5 1 1.5 2 2.5
Relational
Denormalized
Complex data type
Full text search
Advanced relational
Advanced denormalized
Speed with hot cache, seconds
Cloud tag
Cloud tag
Cloud tag
Cloud tag
Cloud tag
Cloud tag
Cloud tag
0 5 10 15 20 25 30 35 40 45
relation
relational simplified
denormalized
array
fts
Speed, seconds
Models comparison
Model
Space
consumption
Search
performance
Ingestion
performance
Housekeep
ing
Search
queries
development
Penguin
maturity
level
Relational equal worst highest minimal worst
Denormalized equal moderate good required moderate
Complex data
type equal moderate moderate required moderate
RDBMS full text
search equal optimal worst required optimal
Our case
Oracle
main
Oracle
DG
Application
server
Application
server
Load
balancer
Client
browser
10000 RPS
In-
memory
cluster
Real data
Source: our software
Extracted entities: Posts, Tags, PostsTags
Date: 2016 to 2017
Tagged objects: 3 000 000
Applied tags: 42 000 000
Unique tags count: 100 000
Max tags count for an object: 15
Max tag length: 50
Architecture
UI
Database evolution
JSON
0.05 с
Database evolution
Oracle 12.1 JSON indexes issuesJSON
1-2 с
Database evolution
JSON
0.1 с
Database evolution
JSON
1 с
UI tricks
Calculate async
Performance failure
• Ingestion degradation: 20%
• Sporadic search degradation up to 40%
Database evolution
-based reporting
JSON
2 с
Database evolution
-based reporting
OLTP DWH
JSON
0.1 с
Real life
20% tags inactive
Database evolution
-based reporting
OLTP DWH
JSON
1 с
Real life
• OR conditions for tags values
• NOT by tag set
• “Last updated by user” search
• Faceted navigation
• Pagination
4 с
Database evolution
-based reporting
OLTP DWH
ONLY
ACTIVE
VALUES
0.5 с
Database evolution
-based reporting
OLTP DWH
0.4 с
Index magic
4 Gb
Index magic
Index magic
• Space saving: 40%
• Ingestion degradation: 1%
• Search improvement: 4%
Final architecture
• Async in UI = hide performance issues
• Denormalized tagging model
• Compressed B-tree indexes – search by tags
• Full text search indexes – name and description
Average search time
0.4 second
Future plans Oracle 18c Faceted search
Future plans Oracle 18c Faceted search
Future plans Oracle 18c Faceted search
Future plans Oracle 18c Faceted search
Future plans Oracle 18c Faceted search
Future plans
0.1 с
=
Future plans
Proper search
FTS
inside DB
+
FTS model
Relational/denormalized/FTS
model
• Approach 1 • Approach 2
FTS server
(Lucene, Sphinx,
Elastic, Solr,
Xapian, etc)
Application
server
Application
server
Apache Solr
• True open source (under Apache)
• Built over Lucene
• Multi-language support
• Various client APIs
• Versatile query language
• Dedicated language for faceted navigation
• Extremely scalable with auto-scale framework
• Full of additional features 
Solr schema
managed-schema.xml:
Test data
Source: http://data.stackexchange.com/stackoverflow
Extracted entities: Posts, Tags, PostsTags
Date: 2008 to 2012
Posts: 3 000 000
Applied tags: 8 000 000
Unique tags count: 30 000
Max tags count for a post: 5
Max tag length: 34
Hardware: VirtualBox, 2 Virtual core 2,6 Ghz, 2 Gb memory, JVM Memory 512 Mb
Basic search queries
Basic search queries
Basic search queries
Basic search queries
Faceted query
Full text search performance
0 0.005 0.01 0.015 0.02 0.025 0.03 0.035 0.04 0.045
Retrieval by id
Retrieval by single tag
Retrieval by multiple tag
Speed, seconds
Solr FTS hot cache DB FTS hot cache
Penguin Maturity Level 80
Conclusion
1. Try and measure
2. Trust in your DBMS unique features
3. Understand how DBMS features created internally
4. No conditions + no faceted navigation = denormalized RDBMS
5. Conditional queries by tags + faceted navigation = FTS server
6. Search by tags <> analytic by tags
THANK YOU
WE ARE HIRING!
Alexander Tokarev
Database expert
DataArt
shtock@mail.ru
https://github.com/shtock

More Related Content

What's hot

Faceted Search with Lucene
Faceted Search with LuceneFaceted Search with Lucene
Faceted Search with Lucenelucenerevolution
 
High Performance JSON Search and Relational Faceted Browsing with Lucene
High Performance JSON Search and Relational Faceted Browsing with LuceneHigh Performance JSON Search and Relational Faceted Browsing with Lucene
High Performance JSON Search and Relational Faceted Browsing with Lucenelucenerevolution
 
Apache Solr/Lucene Internals by Anatoliy Sokolenko
Apache Solr/Lucene Internals  by Anatoliy SokolenkoApache Solr/Lucene Internals  by Anatoliy Sokolenko
Apache Solr/Lucene Internals by Anatoliy SokolenkoProvectus
 
Relational databases for BigData
Relational databases for BigDataRelational databases for BigData
Relational databases for BigDataAlexander Tokarev
 
Building Intelligent Search Applications with Apache Solr and PHP5
Building Intelligent Search Applications with Apache Solr and PHP5Building Intelligent Search Applications with Apache Solr and PHP5
Building Intelligent Search Applications with Apache Solr and PHP5israelekpo
 
Approaching Join Index: Presented by Mikhail Khludnev, Grid Dynamics
Approaching Join Index: Presented by Mikhail Khludnev, Grid DynamicsApproaching Join Index: Presented by Mikhail Khludnev, Grid Dynamics
Approaching Join Index: Presented by Mikhail Khludnev, Grid DynamicsLucidworks
 
PostgreSQL Advanced Queries
PostgreSQL Advanced QueriesPostgreSQL Advanced Queries
PostgreSQL Advanced QueriesNur Hidayat
 
Solr Distributed Indexing in WalmartLabs: Presented by Shengua Wan, WalmartLabs
Solr Distributed Indexing in WalmartLabs: Presented by Shengua Wan, WalmartLabsSolr Distributed Indexing in WalmartLabs: Presented by Shengua Wan, WalmartLabs
Solr Distributed Indexing in WalmartLabs: Presented by Shengua Wan, WalmartLabsLucidworks
 
Data Science with Solr and Spark
Data Science with Solr and SparkData Science with Solr and Spark
Data Science with Solr and SparkLucidworks
 
Introduction to Lucidworks Fusion - Alexander Kanarsky, Lucidworks
Introduction to Lucidworks Fusion - Alexander Kanarsky, LucidworksIntroduction to Lucidworks Fusion - Alexander Kanarsky, Lucidworks
Introduction to Lucidworks Fusion - Alexander Kanarsky, LucidworksLucidworks
 
Thoth - Real-time Solr Monitor and Search Analysis Engine: Presented by Damia...
Thoth - Real-time Solr Monitor and Search Analysis Engine: Presented by Damia...Thoth - Real-time Solr Monitor and Search Analysis Engine: Presented by Damia...
Thoth - Real-time Solr Monitor and Search Analysis Engine: Presented by Damia...Lucidworks
 
Introduction to Apache Solr
Introduction to Apache SolrIntroduction to Apache Solr
Introduction to Apache SolrAndy Jackson
 
Introduction to Apache Lucene/Solr
Introduction to Apache Lucene/SolrIntroduction to Apache Lucene/Solr
Introduction to Apache Lucene/SolrRahul Jain
 
Integrating the Solr search engine
Integrating the Solr search engineIntegrating the Solr search engine
Integrating the Solr search engineth0masr
 
Solr Indexing and Analysis Tricks
Solr Indexing and Analysis TricksSolr Indexing and Analysis Tricks
Solr Indexing and Analysis TricksErik Hatcher
 
New-Age Search through Apache Solr
New-Age Search through Apache SolrNew-Age Search through Apache Solr
New-Age Search through Apache SolrEdureka!
 
Intelligent crawling and indexing using lucene
Intelligent crawling and indexing using luceneIntelligent crawling and indexing using lucene
Intelligent crawling and indexing using luceneSwapnil & Patil
 
Webinar: What's New in Solr 7
Webinar: What's New in Solr 7 Webinar: What's New in Solr 7
Webinar: What's New in Solr 7 Lucidworks
 

What's hot (20)

Faceted Search with Lucene
Faceted Search with LuceneFaceted Search with Lucene
Faceted Search with Lucene
 
High Performance JSON Search and Relational Faceted Browsing with Lucene
High Performance JSON Search and Relational Faceted Browsing with LuceneHigh Performance JSON Search and Relational Faceted Browsing with Lucene
High Performance JSON Search and Relational Faceted Browsing with Lucene
 
Apache Solr/Lucene Internals by Anatoliy Sokolenko
Apache Solr/Lucene Internals  by Anatoliy SokolenkoApache Solr/Lucene Internals  by Anatoliy Sokolenko
Apache Solr/Lucene Internals by Anatoliy Sokolenko
 
Relational databases for BigData
Relational databases for BigDataRelational databases for BigData
Relational databases for BigData
 
Building Intelligent Search Applications with Apache Solr and PHP5
Building Intelligent Search Applications with Apache Solr and PHP5Building Intelligent Search Applications with Apache Solr and PHP5
Building Intelligent Search Applications with Apache Solr and PHP5
 
Approaching Join Index: Presented by Mikhail Khludnev, Grid Dynamics
Approaching Join Index: Presented by Mikhail Khludnev, Grid DynamicsApproaching Join Index: Presented by Mikhail Khludnev, Grid Dynamics
Approaching Join Index: Presented by Mikhail Khludnev, Grid Dynamics
 
PostgreSQL Advanced Queries
PostgreSQL Advanced QueriesPostgreSQL Advanced Queries
PostgreSQL Advanced Queries
 
Solr Distributed Indexing in WalmartLabs: Presented by Shengua Wan, WalmartLabs
Solr Distributed Indexing in WalmartLabs: Presented by Shengua Wan, WalmartLabsSolr Distributed Indexing in WalmartLabs: Presented by Shengua Wan, WalmartLabs
Solr Distributed Indexing in WalmartLabs: Presented by Shengua Wan, WalmartLabs
 
Data Science with Solr and Spark
Data Science with Solr and SparkData Science with Solr and Spark
Data Science with Solr and Spark
 
Introduction to Lucidworks Fusion - Alexander Kanarsky, Lucidworks
Introduction to Lucidworks Fusion - Alexander Kanarsky, LucidworksIntroduction to Lucidworks Fusion - Alexander Kanarsky, Lucidworks
Introduction to Lucidworks Fusion - Alexander Kanarsky, Lucidworks
 
Thoth - Real-time Solr Monitor and Search Analysis Engine: Presented by Damia...
Thoth - Real-time Solr Monitor and Search Analysis Engine: Presented by Damia...Thoth - Real-time Solr Monitor and Search Analysis Engine: Presented by Damia...
Thoth - Real-time Solr Monitor and Search Analysis Engine: Presented by Damia...
 
Introduction to Apache Solr
Introduction to Apache SolrIntroduction to Apache Solr
Introduction to Apache Solr
 
Introduction to Apache Lucene/Solr
Introduction to Apache Lucene/SolrIntroduction to Apache Lucene/Solr
Introduction to Apache Lucene/Solr
 
Integrating the Solr search engine
Integrating the Solr search engineIntegrating the Solr search engine
Integrating the Solr search engine
 
Solr Indexing and Analysis Tricks
Solr Indexing and Analysis TricksSolr Indexing and Analysis Tricks
Solr Indexing and Analysis Tricks
 
New-Age Search through Apache Solr
New-Age Search through Apache SolrNew-Age Search through Apache Solr
New-Age Search through Apache Solr
 
Intelligent crawling and indexing using lucene
Intelligent crawling and indexing using luceneIntelligent crawling and indexing using lucene
Intelligent crawling and indexing using lucene
 
Lucene basics
Lucene basicsLucene basics
Lucene basics
 
How Solr Search Works
How Solr Search WorksHow Solr Search Works
How Solr Search Works
 
Webinar: What's New in Solr 7
Webinar: What's New in Solr 7 Webinar: What's New in Solr 7
Webinar: What's New in Solr 7
 

Similar to Tagging search solution design Advanced edition

Share point 2013 enterprise search (public)
Share point 2013 enterprise search (public)Share point 2013 enterprise search (public)
Share point 2013 enterprise search (public)Petter Skodvin-Hvammen
 
Full Text Search with Lucene
Full Text Search with LuceneFull Text Search with Lucene
Full Text Search with LuceneWO Community
 
Introduction to Solr
Introduction to SolrIntroduction to Solr
Introduction to SolrErik Hatcher
 
(ATS6-PLAT02) Accelrys Catalog and Protocol Validation
(ATS6-PLAT02) Accelrys Catalog and Protocol Validation(ATS6-PLAT02) Accelrys Catalog and Protocol Validation
(ATS6-PLAT02) Accelrys Catalog and Protocol ValidationBIOVIA
 
SharePoint 2013 Search Based Solutions
SharePoint 2013 Search Based SolutionsSharePoint 2013 Search Based Solutions
SharePoint 2013 Search Based SolutionsSPC Adriatics
 
Developing Search-driven application in SharePoint 2013
 Developing Search-driven application in SharePoint 2013  Developing Search-driven application in SharePoint 2013
Developing Search-driven application in SharePoint 2013 SPC Adriatics
 
Supercharging the Value of Your Data with Amazon S3
Supercharging the Value of Your Data with Amazon S3Supercharging the Value of Your Data with Amazon S3
Supercharging the Value of Your Data with Amazon S3Amazon Web Services
 
Web analytics at scale with Druid at naver.com
Web analytics at scale with Druid at naver.comWeb analytics at scale with Druid at naver.com
Web analytics at scale with Druid at naver.comJungsu Heo
 
20130310 solr tuorial
20130310 solr tuorial20130310 solr tuorial
20130310 solr tuorialChris Huang
 
Essentials for the SharePoint Power User - SPTechCon San Francisco 2016
Essentials for the SharePoint Power User - SPTechCon San Francisco 2016Essentials for the SharePoint Power User - SPTechCon San Francisco 2016
Essentials for the SharePoint Power User - SPTechCon San Francisco 2016Drew Madelung
 
IT talk SPb "Full text search for lazy guys"
IT talk SPb "Full text search for lazy guys" IT talk SPb "Full text search for lazy guys"
IT talk SPb "Full text search for lazy guys" DataArt
 
Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...
Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...
Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...Lucidworks
 
Lucene BootCamp
Lucene BootCampLucene BootCamp
Lucene BootCampGokulD
 
How did it go? The first large enterprise search project in Europe using Shar...
How did it go? The first large enterprise search project in Europe using Shar...How did it go? The first large enterprise search project in Europe using Shar...
How did it go? The first large enterprise search project in Europe using Shar...Petter Skodvin-Hvammen
 
Improved Search With Lucene 4.0 - NOVA Lucene/Solr Meetup
Improved Search With Lucene 4.0 - NOVA Lucene/Solr MeetupImproved Search With Lucene 4.0 - NOVA Lucene/Solr Meetup
Improved Search With Lucene 4.0 - NOVA Lucene/Solr Meetuprcmuir
 
SharePoint 2013 Search Operations
SharePoint 2013 Search OperationsSharePoint 2013 Search Operations
SharePoint 2013 Search OperationsSPC Adriatics
 
Take Cloud Hybrid Search to the Next Level
Take Cloud Hybrid Search to the Next LevelTake Cloud Hybrid Search to the Next Level
Take Cloud Hybrid Search to the Next LevelJeff Fried
 

Similar to Tagging search solution design Advanced edition (20)

Share point 2013 enterprise search (public)
Share point 2013 enterprise search (public)Share point 2013 enterprise search (public)
Share point 2013 enterprise search (public)
 
Full Text Search with Lucene
Full Text Search with LuceneFull Text Search with Lucene
Full Text Search with Lucene
 
Introduction to Solr
Introduction to SolrIntroduction to Solr
Introduction to Solr
 
(ATS6-PLAT02) Accelrys Catalog and Protocol Validation
(ATS6-PLAT02) Accelrys Catalog and Protocol Validation(ATS6-PLAT02) Accelrys Catalog and Protocol Validation
(ATS6-PLAT02) Accelrys Catalog and Protocol Validation
 
SharePoint 2013 Search Based Solutions
SharePoint 2013 Search Based SolutionsSharePoint 2013 Search Based Solutions
SharePoint 2013 Search Based Solutions
 
Developing Search-driven application in SharePoint 2013
 Developing Search-driven application in SharePoint 2013  Developing Search-driven application in SharePoint 2013
Developing Search-driven application in SharePoint 2013
 
Supercharging the Value of Your Data with Amazon S3
Supercharging the Value of Your Data with Amazon S3Supercharging the Value of Your Data with Amazon S3
Supercharging the Value of Your Data with Amazon S3
 
Web analytics at scale with Druid at naver.com
Web analytics at scale with Druid at naver.comWeb analytics at scale with Druid at naver.com
Web analytics at scale with Druid at naver.com
 
20130310 solr tuorial
20130310 solr tuorial20130310 solr tuorial
20130310 solr tuorial
 
Essentials for the SharePoint Power User - SPTechCon San Francisco 2016
Essentials for the SharePoint Power User - SPTechCon San Francisco 2016Essentials for the SharePoint Power User - SPTechCon San Francisco 2016
Essentials for the SharePoint Power User - SPTechCon San Francisco 2016
 
IT talk SPb "Full text search for lazy guys"
IT talk SPb "Full text search for lazy guys" IT talk SPb "Full text search for lazy guys"
IT talk SPb "Full text search for lazy guys"
 
Solr 101
Solr 101Solr 101
Solr 101
 
Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...
Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...
Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...
 
Lucene BootCamp
Lucene BootCampLucene BootCamp
Lucene BootCamp
 
How did it go? The first large enterprise search project in Europe using Shar...
How did it go? The first large enterprise search project in Europe using Shar...How did it go? The first large enterprise search project in Europe using Shar...
How did it go? The first large enterprise search project in Europe using Shar...
 
Apache Solr for begginers
Apache Solr for begginersApache Solr for begginers
Apache Solr for begginers
 
Improved Search With Lucene 4.0 - NOVA Lucene/Solr Meetup
Improved Search With Lucene 4.0 - NOVA Lucene/Solr MeetupImproved Search With Lucene 4.0 - NOVA Lucene/Solr Meetup
Improved Search With Lucene 4.0 - NOVA Lucene/Solr Meetup
 
Elasticsearch Introduction at BigData meetup
Elasticsearch Introduction at BigData meetupElasticsearch Introduction at BigData meetup
Elasticsearch Introduction at BigData meetup
 
SharePoint 2013 Search Operations
SharePoint 2013 Search OperationsSharePoint 2013 Search Operations
SharePoint 2013 Search Operations
 
Take Cloud Hybrid Search to the Next Level
Take Cloud Hybrid Search to the Next LevelTake Cloud Hybrid Search to the Next Level
Take Cloud Hybrid Search to the Next Level
 

More from Alexander Tokarev

Open Policy Agent for governance as a code
Open Policy Agent for governance as a code Open Policy Agent for governance as a code
Open Policy Agent for governance as a code Alexander Tokarev
 
Inmemory BI based on opensource stack
Inmemory BI based on opensource stackInmemory BI based on opensource stack
Inmemory BI based on opensource stackAlexander Tokarev
 
Oracle InMemory hardcore edition
Oracle InMemory hardcore editionOracle InMemory hardcore edition
Oracle InMemory hardcore editionAlexander Tokarev
 
Faceted search with Oracle InMemory option
Faceted search with Oracle InMemory optionFaceted search with Oracle InMemory option
Faceted search with Oracle InMemory optionAlexander Tokarev
 
Oracle JSON treatment evolution - from 12.1 to 18 AOUG-2018
Oracle JSON treatment evolution - from 12.1 to 18 AOUG-2018Oracle JSON treatment evolution - from 12.1 to 18 AOUG-2018
Oracle JSON treatment evolution - from 12.1 to 18 AOUG-2018Alexander Tokarev
 
Oracle JSON internals advanced edition
Oracle JSON internals advanced editionOracle JSON internals advanced edition
Oracle JSON internals advanced editionAlexander Tokarev
 
Oracle Result Cache deep dive
Oracle Result Cache deep diveOracle Result Cache deep dive
Oracle Result Cache deep diveAlexander Tokarev
 
Oracle result cache highload 2017
Oracle result cache highload 2017Oracle result cache highload 2017
Oracle result cache highload 2017Alexander Tokarev
 
Data structures for cloud tag storage
Data structures for cloud tag storageData structures for cloud tag storage
Data structures for cloud tag storageAlexander Tokarev
 
Oracle High Availabiltity for application developers
Oracle High Availabiltity for application developersOracle High Availabiltity for application developers
Oracle High Availabiltity for application developersAlexander Tokarev
 

More from Alexander Tokarev (18)

Rate limits and all about
Rate limits and all aboutRate limits and all about
Rate limits and all about
 
rnd teams.pptx
rnd teams.pptxrnd teams.pptx
rnd teams.pptx
 
FinOps for private cloud
FinOps for private cloudFinOps for private cloud
FinOps for private cloud
 
Graph ql and enterprise
Graph ql and enterpriseGraph ql and enterprise
Graph ql and enterprise
 
FinOps introduction
FinOps introductionFinOps introduction
FinOps introduction
 
Open Policy Agent for governance as a code
Open Policy Agent for governance as a code Open Policy Agent for governance as a code
Open Policy Agent for governance as a code
 
Cloud DWH deep dive
Cloud DWH deep diveCloud DWH deep dive
Cloud DWH deep dive
 
Cloud dwh
Cloud dwhCloud dwh
Cloud dwh
 
Inmemory BI based on opensource stack
Inmemory BI based on opensource stackInmemory BI based on opensource stack
Inmemory BI based on opensource stack
 
Oracle InMemory hardcore edition
Oracle InMemory hardcore editionOracle InMemory hardcore edition
Oracle InMemory hardcore edition
 
Faceted search with Oracle InMemory option
Faceted search with Oracle InMemory optionFaceted search with Oracle InMemory option
Faceted search with Oracle InMemory option
 
Oracle JSON treatment evolution - from 12.1 to 18 AOUG-2018
Oracle JSON treatment evolution - from 12.1 to 18 AOUG-2018Oracle JSON treatment evolution - from 12.1 to 18 AOUG-2018
Oracle JSON treatment evolution - from 12.1 to 18 AOUG-2018
 
Oracle JSON internals advanced edition
Oracle JSON internals advanced editionOracle JSON internals advanced edition
Oracle JSON internals advanced edition
 
Oracle Result Cache deep dive
Oracle Result Cache deep diveOracle Result Cache deep dive
Oracle Result Cache deep dive
 
Oracle result cache highload 2017
Oracle result cache highload 2017Oracle result cache highload 2017
Oracle result cache highload 2017
 
Oracle json caveats
Oracle json caveatsOracle json caveats
Oracle json caveats
 
Data structures for cloud tag storage
Data structures for cloud tag storageData structures for cloud tag storage
Data structures for cloud tag storage
 
Oracle High Availabiltity for application developers
Oracle High Availabiltity for application developersOracle High Availabiltity for application developers
Oracle High Availabiltity for application developers
 

Recently uploaded

chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptkotipi9215
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...Christina Lin
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxbodapatigopi8531
 
Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...aditisharan08
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - InfographicHr365.us smith
 
What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number SystemsJheuzeDellosa
 
cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningVitsRangannavar
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfkalichargn70th171
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 

Recently uploaded (20)

chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.ppt
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
 
Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - Infographic
 
What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number Systems
 
cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learning
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 

Tagging search solution design Advanced edition

Editor's Notes

  1. Добрый день. Меня зовут Александр и я решаю в компании DataArt вопросы, связанные с архитектурой приложений, особенно в части баз данных. Я не думаю, что сегодня будет много оракл-специфичных вещей, но возможно вы откроете что-нибудь новое для себя.
  2. Сегодня мы обсудим такие простые и одновременно сложные вопросы, как поиск по тегам, какие он можно создать вызовы как в части базы данных, так и архитектуры приложения в целом Как же должна в итоге выглядеть база данных И как оптимально осущестлять навигацию по тегированным объектам. Я расскажу каким получился наш движок в условиях наших ограничений. После сеции вопросов и ответов я дам ссылки на гитхаб и исходные данные
  3. Что такое тэг на первый взгляд понято: Это некое ключевое слов присвоенное к тегируемому объекты Чаще всего теги задаются неформально либо автором, либо тем, кто просматривает тегируемый объек Если теги неограничены и присваютрся автором, это называется фолксономия (от слова folk - народ) Если же набор ограничен и присвоен создателем, то это таксономия
  4. Собственно как теги представлены визуальнои в вашем приложении и каков их типовой сценарий использования это и определяет архитектуру возможного решения. Это может быть как стандартное облако тегов, так и весьма аскетичное в стиле StackOverflow
  5. Собственно от щелчком на теги которого мы переходим все объекты с данным тегом и получаем подобие faceted навигации в правом угле
  6. И можем уже провалиться в конкретный объект с набором тегов
  7. Более сложной формой представления, которую иногда в ядре строят на тегах является фацетная навигация, где теги круппируются в фацеты и по тегам выводится статистика. Соответсено результат поиска постепенно сужается при выборе нужных тегов. Так как для фацетов используется AND, а для тегов используется OR, это приводит к определённым нюансам, которые мы рассмотрим позже.
  8. Почему же теггинг это хорошо? 1. Потому что он отражает словарь пользовател1 2. Решение гибкое – сам добавил, сам удалил 3. Многомерно по-сути и поэтому тегируемый объект и
  9. Гибкость приводит и к ожидаемым проблемам: Ошибки написания, множественное число, составные слова Неоднозначное присвоение тегов, теги понятные только их автору Использование для описание одного и того же различных синонимиов, акронимов и так далее
  10. Таким образом, гибкость приводит нас к ожидаемым проблемам 1. производительности 2. Тяжести запросов 3. Неконтролируемому увеличению базы данных 4. Дополнительное обслуживание базы данных тегов
  11. На самом деле программист должен сделать в своей жизни ряд вещей: Написать Hello World Посадить дерево Сделать свой tagging search Как сделать его более быстрым сейчас и рассмотрим
  12. Скорее всего, первая попытка сделать движок поиска по тегам и фацетную нафигацию на нём выйдет, но будет весьма незрела. Чтобы оценить её мне кажется как никогда более подходит всем известная вам картинка Собственно пингвинами мы и будем мерить зрелость нашего решения
  13. Если подойти очень обще, то чаще всего архитектурные решения для поиска по тегам и фацетной навигации делятся на 2 вида: Теги хранятся в реляционной базе данных в виде таблиц и общение с ними происходит на языке SQL Теги находятся в полнотекстовой базе данных
  14. Прежде чем мы начнём рассматривать различные модели данных и наш движок надо определиться с тестовыми данными. Я изначала подумал, что неправильно будет создавать абстрактные тестовые данные и воспользовался очевидным источником, который рекомендую и вам для различных экспериментов. Это StackOverflow Обратите внимание, что тегов на пост максимум 5 – это явно сознательное ограничение платформы
  15. Сайт Stackoverflow имеет прекрасный интерфейс для выгрузки данных, в котором можно писать sql к 22 таблицам StackOverflow и сохранять запросы за исключением того, что после 100000 строк надо вводить капчу.
  16. Помните, что я вначале рассказывал, что наличие тегов приводит к некоим проблемам. Например, используются синонимы. Когда я подготавлива тестовые данные в StackOverflow я нашёл ту самую таблицу синонимов.
  17. Попробуем посмотреть на модели БД с точки зрения их зрелости. Первая модель – самая очевидная и нормализованная. Есть таблица тэгов, тегируемых документов и связь между ними. Я бы сказал это начало с точки зрения нашей penguin maturity model.
  18. Когда рано или поздно возникает проблема производительности большинство переходит к денормализованной модели с не менее очевидной структурой. Тэги привязаны сразу же к документу без промежуточной таблицы. Тем не менее при увеличении набора данных данных даже такой денормализации становится недостаточно и тут обычно все пытаются уже использовать фишки СУБД
  19. Какие? Абсолютно понятные – возможность хранить составные типы данных в одной строке с данными исходного документа. Наиболее опасный момент данного решение состоит в том, чтобы понять как это решение устроено изнутри и не является ли такой сложный тип замаскированными таблицами. Давайте посмотрим на эти типы данных в Oracle
  20. Теперь посмотрим, что в оракле Для начала создаём теги и массив из них А далее указываем, что данный массив должен находиться в таблице Есть некий синтаксический сахар, который наталкивает на мысли о дополнительной проверке Проверяем не является ли TAGS_TAB обыкновенной таблицей и вроде бы данных нет, НО!
  21. На первый взгляд всё хорошо, ибо таблицы нет, но…
  22. Однако когда мы смотрим в таблицу объектов и индексов, то видно, что всё же таблица существует, но её не видно простыми средствами. Столбцы её видны в другом месте, что показывает, что в целом этот вариант аналогичен варианту с денормализацией и разница проявится в будущем только в запросах Создадим тогда обычный уникальный индекс для ускорения поиска, ибо у Оракла нет аналогов GIN и начнём замеры
  23. Однако когда мы смотрим в таблицу индексов, то видно, что всё же таблица существует, но её не видно простыми средствами. Столбцы её видны в другом месте, что показывает, что в целом этот вариант аналогичен варианту с денормализацией и разница проявится в будущем только в запросах Создадим тогда обычный уникальный индекс для ускорения поиска, ибо у Оракла нет аналогов GIN и начнём замеры
  24. В оракле тем не менее существует тип данных, который позволяет хранить массивы в рамках одной строки без вспомогательных объектов. Как вы думаете, что это за тип? Это vararray Обратите внимание, что я указал, что он будет храниться как lob.
  25. Собственно если я его не буду указывать как lob, то он будет храниться в блоке данных до 4000 строк, но после – всё равно как LOB. Из этого и вытекает главный недостаток.
  26. Добавляем данные, индексируем и Получаем ошибку Собственно поэтому дальше этот тип данных я рассматривать не буду
  27. Посмотрим как это сделано в постгресс. Создаём таблицу с типом данных Массив, заполняем её данными идентицируем файл, в котором она находится
  28. Создаём таблицу с типом данных Массив, заполняем её данными идентицируем файл, в котором она находится
  29. Собственно вот наш файл, причём размером 8 килобайт – стандартный размер страницы в пострессе и мы видим, что с Postgress ситуация несколько лучше – массивы хранятся в том же блоке данных, что и основная таблиц, однако есть нюанс
  30. Если почитать документацию Postgres, то можно увидеть, что inline не настоящий  Но я слабо верю, что тегов может стать так много, что значения выйдут за 2 килобайта
  31. Но самое главное, что постгресс позволяет индексировать массивы с использованием GIN (Generalized Inverted Index) индекса, который является обычным инвертированым индексом.
  32. Следующим шагом видится использование полнотекстовых средств в СУБД. Теги можно сохранить в разном формате. Например, с разделителями в подобии XML или в JSON. Определившись с данными моделями, посмотрим на их количественные характеристики
  33. Самая первая характеристика – время вставки. Как мы видим по скорости выигрывает значительно реляционная модель. В целом ничего удивительно. Id тегов разово зачитаны в кэш, а дальше идёт lookup их id и вставка. Худший вариант на удивление не полнотекстовый, а со сложными типами данных, но я подозреваю, что это нюансы Оракла, а проверить на постгрес я не успевал. Скорее всего ситуация будет иная. Кстати, как вы думаете, какая модель данных будет занимать больше места?
  34. Посмотрим, что у нас получается с точки зрения места. Важно обратить внимание, что в целом модели с точки зрения места примерно равны. Огромной разницы не наблюдается. Разница наблюдается только в пропорции Данные/Индекс. Также стоит обратить внимание, что в целом 8 миллионов тегов занимают более чем скромный объем места, что говорит об уместности inmemory баз данных для данной задачи.
  35. Собственно запросы поиска по ID по каждой модели абсолютно понятны  Собственно тут более позновательны результаты, так как в случае денормализованных/нормализованных моделе возвращается набор строк, а полнотекстовой/сложных типов – одну строку Запомните это – все запросы помещаются на одну страницу
  36. В целом я показал время до и после прогрева кэшей СУБД, но в целом я бы сконцентрировался после прогрева. Тут явным фаворитом является полнотекстовая модель, так как не требует вообще никаких дополнительных действий для извлечения информации. Я даже специально разместил их на разных диаграммах, так как порядки скоростей очень сильно отличаются Из-за нюансов того, как в оракле организованы сложные типы данных, по которым можно индексировать очевидно, что денормализованная и модель со сложными типами данных совпадают.
  37. На одном теге уже начинает проявляться разница. Само собой, она уже сильно зависит от СУБД. В целом, возможны различные формы написания запроса в денормализованной и нормализованной форме для одного тэга, например с exists или in, но уже по количеству строк видно, что ситуация весьма тяжела
  38. Собственно для сложных типов данных и для полнотекстового поиска запросы очень читаемы
  39. Вообще то, возможно следовало усложнить данный тест искав по тегу с более чем средним количество, менее чем средним, да ещё и добавив бы пейджинг с выводом первой страницы, и, например, третьей, но я не думаю, что от этого много что изменится с точки зрения пропорций. Как всегда полнотекстовый поиск показывает весьма неплохие результаты. Итак, начинается самое интересное.
  40. 2 тега в поиске. Обратите внимание, что это AND – мы оч.ень плавно подходим к идее faceted search, поэтому очевидный на первый взгляд OR не подходит Уже два запроса не помещаются на слайд.
  41. Собственно с денормализованным подобная же штука
  42. Однако, если у вас в команде завёлся редкий зверь, знающий SQL, больше чем ORM, то у вас появится что-то гораздо менее читаемое, но эффективное. Тут вся магия показана на count, так как нам надо имитировать and условие не джоиня одну таблицу множество раз Нормальный оптимизатор буквально вытягивает этот план и запрос работает более чем быстро Более того, этот запрос очень удобен для кодогенерации
  43. В целом такой же трюк проделывается с денормализованной таблицей
  44. Полнотекстовые запросы и запросы со сложными типами данных очень простые. Полнотекстовый в оракле очень выразительный – мы условие пишем прямо внутри запроса
  45. Чем больше тегов в условиях, тем грустнее и грустнее поиску на реляционной модели данных. В общем как мы видим, деградация порядка 50 раз, тогда как у полнотекстового растёт пропорциональн количеству тегов в запросе.
  46. Собственно особо cloud tag никто на лету не собирает – его предрасчитывают, но мы попробуем для общего развития Для реляционной модели можно выкинуть табличку Document, так как она в целом нам не нужна для расчёта количества Денормализованная как всегда очевидна
  47. В целом, эти запросы можно сократить до следующих, так как таблица document не участвует в списке полей для вывода
  48. Что интересно, на самом деле Оракл и выполняет эти запросы в виде 2. Это видно из плана выполнения. Подозреваю, что и в других СУБД с адекватным оптимизатором будет происходить тоже самое. Как вы думаете, почему оракл делает так и как испортить это?
  49. Что интересно, на самом деле Оракл и выполняет эти запросы в виде 2. Это видно из плана выполнения. Подозреваю, что и в других СУБД с адекватным оптимизатором будет происходить тоже самое. Как вы думаете, почему оракл делает так и как испортить это?
  50. С точки зрения полнотекстовых чуть сложнее, ибо придётся их либо раскрыть, либо попарсить json Давайте что-ли перед переходом к выводам по cloud tag посмотрим что же было популярно в те года. Каковы ваши ставки – какие теги будут на первых трёх местах?
  51. Итак, с небольшим отрывом лидирует C#!
  52. Ожидаемо по тегам реляционные модели быстрее чем полнотекстовые
  53. Итак, подытожим. Если вам надо искать в реляционной базе медленно, но вы можете смириться с медленной вставкой, то ваш выбор – полнотекстовые индексы, но будьте готовы к их глюкам. Хотите жизни +- без проблем старое доброе денормализованное решение – чёткий середнячёк. Казалось бы, пора завершить, но где же рассказ как сделано у нас и о том, как же надо?
  54. Итак, расскажу как сделан поиск в одном из наших программных продуктов. Это архитектура система полуавтоматизированной обработки финансовой документации. Архитектура системы стандартна для Enterprise. Клиент, балансировщик, 2 сервера приложений для расчёта бизнес-логики, база данных Oracle и её резервный экземляр. Мы очень хотели дополнить архитектуру сервером полнотекстового поиска, но Заказчик отказался, поэтому было принято делать решение по поиску на стороне базы данных.
  55. Итак, какие у нас сейчас цифры. Посмотрим на них уже в знакомом формате. Обратите внимание, если на stackoverflow мы за 4 года набрали 3 миллиона, то мы за 2 года набрали 3, т.е. Интенсивность тегирования у нас где-то в 2 раза больше. Важно понимать, что в нашей системе у нас гибрид между таксономией и фолксономией. При создании объектов создаётся ряд тегов в зависимости от типа объекта, а далее пользователи могу его тегировать сами исходя из бизнес-ситуаций либо произвольными тегами, либо набором значений. Если обобщить все показатели у нас где-то в 3 раза больше чем у StackOverflow
  56. В целом, система в части теггинга устроена архитектурно очевидно. Есть веб-сервис, которым пользуются другие сервисы, BPM система и собственно. Всего у нас в системе около 40 сервисов, при этом 5 из них пользуются теггинг сервисом в части поиска и наверное 10 в части вставки. В целом все сервисы кроме UI создают очень простые запросы к теггинг сервису. В основном это выборки по условию AND, где задействовано 3-5 тегов и они работают очень быстро в целом не создавая никаких проблем. Таких простых запросов у нас где-то 3000 в секунду, в то время как 7000 это запросы от UI.
  57. Как я уже говорил ранее UI большей частью определяет архитектуру решения по теггинг сёрчу. Собственно все тонкие штуки, которые мы использовали появились из-за постоянного усложнения UI хотелками пользователей. К сожалению, я не могу показать скриншот из реального приложения по понятным причинам, но сейчас интерфейс схематически выглядит примерно так. Собственно Search template применяюся по-умолчанию к любому поиску, в текстовое поле можно вбить текст, по вхождению которого фильтруются теги. Также в верхней панели можно выбрать набор пользователей, которые меняли теги и набрать теги, которые если присутствуют в объекте, но объекты надо исключить. Слева находится собственно окно фацентной навигации Посмотрим как эволюционировала база данных, чтобы поддержать такой интерфейс
  58. Мы изначала думали, что пойдём как нормальные люди с хранением тегов в JSON, их парсингом и полнотекстовым поиском как в модели 4, поэтому первый этап решения был такой. В целом оно проработало в таком режиме 2 месяца и никаких проблем не было. Однако, через 2 месяца бизнес сказал, что хочет иметь типизированые тэги
  59. потому что столкнулся с проблемами неправильных именований и удобством использования. Казалось бы в чем проблема, но начались проблемы, связанные с полнотекстовыми индексами по JSON в Oracle 12.1 При дополнительной фильтрации по типам не всегда стал учитываться индекс
  60. Соответственно мы добавили таблицу типов и продолжили хранить джейсон, ибо было много типов тегов, где даже в рамках одного типа использовался набор тегов
  61. Запросы со стороны клиентского приложения становились более сложными и разработчики попросили сделать view, в котором теги были бы уже распаршенены, так как возможностей ораклового полнотекстового индекса в 12.1 не хватало. В целом, индексы продолжали работать, но уже на 20% запросов не подхватывались. Скажем так, на оракл 12.2 таких бы проблем не было, но возможности обновить версию субд не было.
  62. Собственно чтобы решить проблему того, что запросы отпрабатывают по секунде мы решили отложить их оптимизацию на более поздний срок, но статистику по faceted navigation пересчитывать асинхронно после того, как пользователь выбрал фацеты для поиска, а не одновременно с поиском. Как результат через 1 секунду появляются результаты поиска, а новые цифры с учётом выбранного появляются секунды через 3.
  63. Мы обратили внимание, что началась снижаться скорость вставки и иногда стали подтормаживать запросы. В целом скорости хватало, пока деградация по вставке не достигла 20% и очень часто стал медленно работать сам теггинг сёрч.
  64. Заглянув в базу данных мы увидели набор функционально-ориентированных индексов, причём ряд из них был ещё и Bitmap-индексами, которые весьма драматично влияют на вставку в OLTP-системах. Эти индексы были построены для выпаршивания определённых тэгов и аналитки по ним, причём запросы создавал Looker более чем сложные Вскрылось, что на тэгах делается множество отчётов BI-командой
  65. Поэтому мы сделали для аналитиков денормализованные датамарты в нашем хранилище, в который данные перемещали etl-джобами
  66. А потом наши пользователи захотели смотреть историю по тегам, причем распределение сейчас таково, что 20% тегов неактивно
  67. Собственно появилсь поля для хранения истории, что замедлило поиск с учётом того, что 20% лишнее.
  68. В очередной раз к нам пришли пользователи и им понадобился набор функционала, на котором текущее решение стало весьма медленным. Такие вещи как поиск по тегам с OR, возможность исключения объектов при наличии определённых тегов, добавление к условиям поиска по тегам «последнего изменившего» пользователя, фацетная навигация и пейджинг роняли производительность где-то процентов на 40. Если вы помните запросы к моделям данных, то запрос на поиск по тегам занимал на данном этапе около листа А4.
  69. Наступало время релиза и было принято решение денормализовать таблицу тегов к варианту 2, который мы рассматривали в самом начале нашей презентации, чтобы исключить влияние парсинга джейсона и боли с полнотекстовыми индексами в версии 12.1. Так как джаву времени не оставалось менять в части вставки, то сделали триггер, поменяли view , снесли полнотекстовые индексы и исключили специфичный код для учёта их нюансов. Ну и как видно появилась таблица со списком фацетов Что важно – в таблице тегов для поиска лежат только текущие активные теги без истории
  70. Собственно после релиза мы сделали следующее – убрали триггер и сделали денормализацию на application server-е, Убрали забосы к вьюхе и написали выделенные запросы прямо на таблицу, а главное, проанализировали по каким комбинациям тегов чаще всего идёт поиск и также их денормализовали. По 2 всё же пришлось построить полнотекстовый индекс, но в нём отсутствовали проблемы характерные для JSON индексов, поэтому он проблем нам не доставляет.
  71. Хотелось бы ещё остановится на индексе, игры с которыми нам тоже дали прирост в скорости. Основной индекс выглядит и занимает примерно 4 гигабайта. Вроде бы немного и этим можно принебречь, но попробуем не только уменьшить размер индекса, но и получить некий прирост производительности. Для этого используем компрессию индексов.
  72. Суть компрессированого индекса состоит в том, что для повторяющихся значений составных полей создаётся префиксная таблица, а в блоке данных хранятся указатели на данную таблицу. Из-за этого индекс занимает меньше места, меньше уходит операций ввода-вывода, но растёт нагрузка на CPU и незначительно уменьшается скорость вставки.
  73. Compress 2 говорит о том, что для полей object_type_id и tag_type_id будет создана префиксная таблица, а так как эти поля совпадают у множества строк, то мы получим серьёзную экономию В цифрах мы получили серьёзную экономию места, но главное поиск ускорился на 6% фактически забесплатно.
  74. Если суммировать, то проблемы были решены через асинхронный пользовательский интерфейс, денормализованную модель в реляционной бд, обычные индексы с префиксами, чтобы занимать меньше места и полнотекстовые индексы только для поиска по 2-м тегам. Когда идёт совместный поиск Oracle делает порой весьма эффективную операцию index combine и запросы весьма эффективны. Как бы я оценил наше решение? Ну наверное так – ездит на самом деле быстро, но требует усилий, чтобы не упасть.
  75. Собственно у нас много планов на будущее. Например, в последней версии Оракла 18с появился встроенный в их полнотекстовый сервер функционал фацетной навигации. Не знаю пока, насколько он быстр и безопасен при реальных объёмах, но мы обязательно его изучим. Он позволяет указать, в каких тегах лежат данные по каким фацетам и осуществлять поиск по ним с возвратом агрегатов. На малых объемах это работает весьма резво, на больших руки не дошли проверить. Вначале создаем объект для хранения фацетов, Пото задаем правила извлечения фацетов из текста и их типы данных, а потом по каким будет идти поиск в соответствии со сценарием Практически уверен, что Postgres, который очень любит копировать, воплотит это скоро.
  76. Далее есть 2 варианта Использовать гибкую структуру с тегами и предыдущих настроек будет достаточно чтобы создать индекс на основе фацетов, указанных на предыдущей странице Видите, поля в xml совпадают с настройками фацетов
  77. Либо испозовать плоскую таблицу с небольшими ухищрениями, где мы указываем, что поля для фацетов лежат в реляционной структуре, ну а после этого создаём индекс как обычнос использованием маппинга
  78. Собственно выполняем поиск в нашем индексе по ключевому слову, указав, какие нам нужны фацеты на выходе Ну и собственно обратите внимание, что для каждой группы можно задавать свои параметры сортировки и прочего
  79. И получаем наши фацеты с агрегатами с xml в соответствии с заданными ранее параметрами. Выглядит весьма многообещающе, но на реальных объемах данных, с учётом постоянной вставки и изменения данных в таблицы, а также что пользователей много я ещё не проверял. Ситуация может радикально поменяться.
  80. Встроенный в Oracle фацетный поиск выглядит круто, но возможно и не взлетит, а у нас пока что нет времени, на переход на красивые и правильные архитектуры, тем не менее хочется быть всё быстрее. Итак, на самом деле мы уже почти на максимальном уровне того, что можно вытащить из текущей архитектуры. Сейчас мы находимся на этапе проверки как же текущую модель данных с минимальными переделками может ускорить Oracle In-Memory и в целом у нас это получается В целом у нас получилось ценой финансовых вливаний в лицензии и где-то недели времени работы получить ускорение где-то в 4 раза и новые цифры теперь выглядят так
  81. В целом я буду рассказывать про то, как же нам это удалось на In-Memory Summit в этом году и если приложу усилия, то и на Highload++, так как уже сейчас предложенный доклад вызвал живой интерес.
  82. Исходя из нашего опыта мы делаем вывод, что полнотекстовые сервера это хорошо и правильно, но они не должны быть расположены в базе данных, так как возникали проблемы с их производительностью, более медленной реакцией саппорта на баги и линейной деградацией при увеличении тегов в запросах.
  83. Рассмотрим поиск по тегам с использованием Apache Solr. Почему Солр, а не эластик? Ну я просто его люблю и в нём есть встроенный язык для фацентной навигации
  84. Мы будем испольовать режим работы солра со схемой и будем работать с данными, хранимыми следующим образом в файле magaged-schema.xml Сообзазно указанной ранее схеме tags это массив из строк тегов. Я не стал его делать просто текстом, чтобы не усложнять. Фактически на solr мы делаем модель со сложными типами данных
  85. Я взял те же самые тестовые данные, что и в примере с реляционными базами данных, но занизил память и процессоры в 2 раза
  86. И проверим в Солре наши ключевые запросы Поиск по идентификатору
  87. Поиск по одному тегу с сортировкой, фильтрацией и пейджингом. Обратите внимание, что время подскачило весьма ощутимо, но в целом очень приемлемо, особенно с учётом того, что есть сортировка
  88. Убедимся, что добавление нескольких тегов не приводит к деградации производительности, что очень существенно
  89. Ну и в итоге попробуем создать облако тегов с использованием упрощённого варианта языка фацетов Для фацетов уже нет UI, поэтому запрос я собрал в адресной строке. В целом, в данном синтаксисе можно уже добавить группы по категориям аналогично как мы делали в Oracle и facets будут считаться по ним. Что важно, что время всё равно очень быстрое Кстати, вам не кажется, что что-то странное произошло с облаком? Да, си шарп превратился в си, потому что надо так настроить токенайзер, чтобы он его не обрезал шарп
  90. Так как синтаксис фацетов очень обширен, то сейчас запросы для фацетной нафигации принято делать в JSON, который SOLR прекрасно обрабатывает. Например, интервальные фацеты по 2 категориям в старом синтаксисе были конечно понятливы, но в новом гораздо более структурированы.
  91. В общем то это показывает, что решения на базе полнотекстовых серверов являются оптимальными для поиска по тегам и фацетной навигации как по численным показателям, но и по выразительности запросов Кстати, хочу заметить, что для примера со StackOverflow я интереса ради разворачивал кластер из 2-х нод с равномерным распределением коллекции по кластеру. В целом радикально быстрее не стало, разница была около 10%, скорее всего он себя проявит в многопользовательском режиме.
  92. В целом, можно найти много примеров очень продвинутых архитектур для фацетного поиска, но сложные архитектуры чаще всего диктуются предметной областью и требуют отдельного доклада.
  93. Не верьте в универсальные решения – померьте скорость на ваших тегах и на ваших сценариях, всё может быть по-иному Верьте в вашу систему базы данных, неважно реляционная она или полнотекстовая – использование уникальных возможностей позволит съэкономить кучу времени на разработку Придётся разобраться, как фишки работают изнутри. Составные типы данных в оракле и как в Солре Си шарп превратился в Си превосходные примеры для этого. Выберите лучшую модель от того, что у вас есть Если у вас не будет нагрузки StackOverflow и Instagram, а сценарий использования как у них – не тратьте время, решения на базе реляционной базы данных более чем эффективно работают Если у вас есть сложные запросы, особенно от пользователей или фацетная навигация используйте полнотекстовые решения. На самом деле, я видел для фацетной навигации и самостоятельные решения на том же in memory grid oracle coherence, но мне они кажутся переусложнёнными 7. Поиск не равен аналитике