{"id":12792,"date":"2022-02-16T08:34:12","date_gmt":"2022-02-16T16:34:12","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=12792"},"modified":"2025-06-13T21:25:06","modified_gmt":"2025-06-14T04:25:06","slug":"leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/","title":{"rendered":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc560\ub110\ub9ac\ud2f1\uc2a4 \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218(UDF)\ub85c ML \ubaa8\ub378 \ud65c\uc6a9\ud558\uae30"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">With Couchbase 7.0 you&#8217;re now capable of allowing integration of Python UDFs with Couchbase Analytics. In <a href=\"https:\/\/www.couchbase.com\/blog\/ml-meets-nosql-integrating-python-user-defined-functions-with-n1ql-for-analytics\/\">Part 1 of this blog series<\/a>, we covered the essentials for getting Couchbase and the Analytics for Machine Learning (ML) set up.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">ML has radically transformed the ways in which organizations understand their customer\u2019s needs. Advanced analytics domains like predictive analytics (customer churn, customer sentiment, etc.) and financial modeling are growing more reliant on processing data at scale, near real-time and extracting valuable insights from it.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To help our customers obtain analytical insights in real time, we have created a seamless pipeline from Python-based machine learning models to Couchbase Analytics. In this post, I walk through the following steps to show you how to apply external algorithms to data that is resident in Couchbase.<\/span><\/p>\n<h4><span style=\"font-weight: 400;\">Six steps for applying ML models against your NoSQL data:<\/span><\/h4>\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Train the Model<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Codify the Model<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Package and Deploy the code<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Import the needed data for this project<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Writing the UDF<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Using the UDF in your instance for CB (DP Mode)<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">Before we dive in, let&#8217;s find a dataset that will make an interesting demonstration of the capabilities we are building. There are movie reviews on several different websites, but to have a holistic understanding of critic reviews there is no better place than Rotten Tomatoes. This website allows you to compare the ratings given by regular users (audience score) and the ratings or reviews given by critics (<em>tomatometer<\/em>) who are certified members of various writing guilds or film critic associations.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The two datasets used for this blog can be found on <\/span><a href=\"https:\/\/www.kaggle.com\/stefanoleone992\/rotten-tomatoes-movies-and-critic-reviews-dataset\"><span style=\"font-weight: 400;\">kaggle.com<\/span><\/a><span style=\"font-weight: 400;\">. These are rather large files so a link to them is provided so you can download them when you follow along.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">In the <\/span><em><span style=\"font-weight: 400;\">movies<\/span><\/em><span style=\"font-weight: 400;\"> dataset, each record represents a movie available on Rotten Tomatoes, with the URL used for scraping the movie title, description, genres, duration, director, actors, user ratings, and critic ratings. In the <\/span><em><span style=\"font-weight: 400;\">movie_reviews<\/span><\/em><span style=\"font-weight: 400;\"> dataset, each record represents a critic review published on Rotten Tomatoes, with the URL used for scraping the critic name, review publication, date, score, and content.<\/span><\/p>\n<h4><span style=\"font-weight: 400;\">Training the ML model<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">Before you start exploring the power of integration between ML and NoSQL, you\u2019ll need to develop and train a machine learning model in Python.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For the purposes of this blog, we will use a simple logistic regression model that utilizes the scikit-learn library. At its core, the model takes in data and analyzes their sentiments regarding movie reviews. You can follow along with the steps outlined below or you can download all of the necessary files from our <\/span><a href=\"https:\/\/github.com\/couchbaselabs\/AnalyticsML\"><span style=\"font-weight: 400;\">GitHub repo<\/span><\/a><span style=\"font-weight: 400;\">.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For this blog, we are using an open-source predictive algorithm on the movie reviews dataset to determine sentiment, i.e., to determine if the reviews are positive or negative for a given movie. In today\u2019s examples, we have already trained the model using a subset from the file you downloaded earlier. For the purposes of this blog we utilize a CSV (comma-separated values) file to import our data.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Below is a sample of the code for the model itself:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12793\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/02\/python.png\" alt=\"\" width=\"1600\" height=\"1152\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python.png 1600w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python-300x216.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python-1024x737.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python-768x553.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python-1536x1106.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python-20x14.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python-1320x950.png 1320w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">The entirety of the code sample can be found in the <\/span><a href=\"https:\/\/github.com\/couchbaselabs\/AnalyticsML\"><span style=\"font-weight: 400;\">GitHub repository.<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">When you run the model Python script shown above, you should get the following result:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12794\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/02\/python2.png\" alt=\"\" width=\"655\" height=\"365\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python2.png 655w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python2-300x167.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python2-20x11.png 20w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">You can read more about scikit-learn metrics like precision, recall, f1-score, and support <\/span><a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.metrics.precision_recall_fscore_support.html\"><span style=\"font-weight: 400;\">here<\/span><\/a><span style=\"font-weight: 400;\">. We now have a functional, well-performing machine learning model fully trained in Python.<\/span><\/p>\n<h4><span style=\"font-weight: 400;\">Creating a Python library<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">In order to reference the machine learning model, you will need to create a Python library. Below is the library for this particular example:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12795\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/02\/python3.png\" alt=\"\" width=\"1600\" height=\"966\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python3.png 1600w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python3-300x181.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python3-1024x618.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python3-768x464.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python3-1536x927.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python3-20x12.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python3-1320x797.png 1320w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">There are two primary components of the library:<\/span><\/p>\n<p><b>Model constructor<\/b><span style=\"font-weight: 400;\">\u2014This constructor creates a file called <\/span><em><span style=\"font-weight: 400;\">sentiment_model<\/span><\/em><span style=\"font-weight: 400;\"> in the <\/span><span style=\"font-weight: 400;\"><em>pipelines<\/em> <\/span><span style=\"font-weight: 400;\">folder of our Jupyter environment.<\/span><\/p>\n<p><b>getSentiment method<\/b><span style=\"font-weight: 400;\">\u2014This method predicts the customer sentiment associated with the parameter (or argument) passed into it.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Save the file as <\/span><i><span style=\"font-weight: 400;\">sentiment.py<\/span><\/i><span style=\"font-weight: 400;\"> within the <\/span><i><span style=\"font-weight: 400;\">pipelines<\/span><\/i><span style=\"font-weight: 400;\"> folder with the file <\/span><i><span style=\"font-weight: 400;\">sentiment_model<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h4><span style=\"font-weight: 400;\">Packaging and deploying the library<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">This is a critical step in what will come next\u2014unlocking the power of Python user-defined functions! Please pay attention to detail as it is more syntax-dependent than any of the others. Be sure to read the appropriate documentation closely. Follow the link <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/analytics\/9_udf.html#external-functions\"><span style=\"font-weight: 400;\">to learn more about User-Defined Functions<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To package the model and library we created in the previous steps, we will use the shiv utility. If shiv is not already installed, use the command <\/span><i><span style=\"font-weight: 400;\">pip install shiv<\/span><\/i><i><span style=\"font-weight: 400;\"> (or <\/span><\/i><i><span style=\"font-weight: 400;\">pip3 install shiv<\/span><\/i><span style=\"font-weight: 400;\"> depending on your environment). Additionally, if you\u2019re interested in reading the documentation for this command line utility, you can find it <\/span><a href=\"https:\/\/shiv.readthedocs.io\/en\/latest\/\"><span style=\"font-weight: 400;\">here<\/span><\/a><span style=\"font-weight: 400;\">.\u00a0<\/span><\/p>\n<p><b>Steps to package the model:<\/b><\/p>\n<ul>\n<li><span style=\"font-weight: 400;\">On your laptop, package the sentiment model and the model code. This makes it self-executing and removes any library dependencies:<\/span><\/li>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><i><span style=\"font-weight: 400;\">shiv &#8211;site-packages pipelines\/ -o pipeline.pyz &#8211;platform manylinux1_x86_64 &#8211;python-version 39 &#8211;only-binary=:all: scikit-learn<\/span><\/i><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">&#8211;platform manylinux1_x86_64<\/span><span style=\"font-weight: 400;\"> is only needed when using a virtual machine running Linux.<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Copy the self-contained Python package with the needed dependencies to the analytics server:<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><i><span style=\"font-weight: 400;\">docker cp pipeline.pyz cb-analytics:\/tmp\/<\/span><\/i><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Access the shell of the <\/span><span style=\"font-weight: 400;\">cb-analytics<\/span><span style=\"font-weight: 400;\"> Docker container:<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">docker exec -it cb-analytics bash<\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">From within the Docker shell, go to the <\/span><span style=\"font-weight: 400;\">tmp <\/span><span style=\"font-weight: 400;\">folder where the zip file is located and import the data needed for the two buckets:<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><i><span style=\"font-weight: 400;\">cd \/tmp<\/span><\/i><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><i><span style=\"font-weight: 400;\">curl -v -X POST -F &#8220;data=@.\/pipeline.pyz&#8221; -F &#8220;type=python&#8221; &#8220;localhost:8095\/analytics\/library\/Default\/sentimentlibrary&#8221; -u Administrator:password;<\/span><\/i><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">The system will update when it is complete and will be successful when you see this HTTP 200 response:<\/span><\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12796\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/02\/python4.png\" alt=\"\" width=\"814\" height=\"248\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python4.png 814w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python4-300x91.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python4-768x234.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python4-20x6.png 20w\" sizes=\"auto, (max-width: 814px) 100vw, 814px\" \/><\/p>\n<h4><span style=\"font-weight: 400;\">Importing Bucket Document For The UDF To Analyze<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">There are two steps to take on your local machine and three commands to run on the Docker instance.<\/span><\/p>\n<p><b>Local machine<\/b><\/p>\n<p><span style=\"font-weight: 400;\">0. Create buckets <\/span><em><span style=\"font-weight: 400;\">movie<\/span><\/em><span style=\"font-weight: 400;\"> or <\/span><em><span style=\"font-weight: 400;\">movie_reviews <\/span><\/em><span style=\"font-weight: 400;\">either in the <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/manage\/manage-buckets\/create-bucket.html#create-bucket-using-couchbase-web-console\"><span style=\"font-weight: 400;\">web console<\/span><\/a><span style=\"font-weight: 400;\"> or via the <\/span><em><a href=\"https:\/\/docs.couchbase.com\/server\/current\/cli\/cbcli\/couchbase-cli-bucket-create.html#examples\"><span style=\"font-weight: 400;\">couchbase-cli<\/span><\/a><\/em><span style=\"font-weight: 400;\"> command<\/span><\/p>\n<ol>\n<li><span style=\"font-weight: 400;\">Run: <\/span><span style=\"font-weight: 400;\"><em>docker cp rotten_tomatoes_critic_reviews.csv<\/em> <em>cb:\/tmp\/ <\/em><\/span>This file is over the 100Mb limit of the GUI import utility and needs to be imported directly.<\/li>\n<\/ol>\n<p><b>Docker instance<\/b><\/p>\n<p><em><span style=\"font-weight: 400;\">2. docker exec -it cb bash<\/span><\/em><\/p>\n<p><em><span style=\"font-weight: 400;\">3. cbimport csv &#8211;infer-types -c https:\/\/localhost:8091 -u Administrator -p password -d &#8216;file:\/\/rotten_tomatoes_critic_reviews.csv&#8217; -b &#8216;movie_reviews&#8217; &#8211;scope-collection-exp &#8220;_default._default&#8221; -g &#8220;%rotten_tomatoes_link%&#8221;<\/span><\/em><\/p>\n<p><em><span style=\"font-weight: 400;\">4. cbimport csv &#8211;infer-types -c https:\/\/localhost:8091 -u Administrator -p password -d &#8216;file:\/\/rotten_tomatoes_movies.csv&#8217; -b &#8216;movies&#8217; &#8211;scope-collection-exp &#8220;_default._default&#8221; -g &#8220;%rotten_tomatoes_link%&#8221;<\/span><\/em><\/p>\n<p><span style=\"font-weight: 400;\">You can either import the last file (<\/span><em><span style=\"font-weight: 400;\">rotten_tomatoes_movies.csv<\/span><\/em><span style=\"font-weight: 400;\">) from the command line as shown above or from the <\/span><i><span style=\"font-weight: 400;\">Couchbase Web Console &gt; Document &gt; Import<\/span><\/i><span style=\"font-weight: 400;\"> screen from the Couchbase portal as shown in this screenshot:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12797\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/02\/python5.png\" alt=\"\" width=\"1600\" height=\"545\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python5.png 1600w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python5-300x102.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python5-1024x349.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python5-768x262.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python5-1536x523.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python5-20x7.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python5-1320x450.png 1320w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">You now have documents in the two buckets and they contain the review and the movie summaries in Couchbase to run your sentiment analysis against.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12798\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/02\/python6.png\" alt=\"\" width=\"715\" height=\"377\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python6.png 715w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python6-300x158.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/02\/python6-20x11.png 20w\" sizes=\"auto, (max-width: 715px) 100vw, 715px\" \/><\/p>\n<h4><span style=\"font-weight: 400;\">Writing UDFs<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">It\u2019s time to write our very own user-defined function in Couchbase Analytics. If you need a refresher, here is a link to our documentation on <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/analytics\/9_udf.html\"><span style=\"font-weight: 400;\">User-Defined Functions<\/span><\/a><span style=\"font-weight: 400;\">. Refer to the library (the <\/span><em><span style=\"font-weight: 400;\">Model<\/span><\/em><span style=\"font-weight: 400;\"> constructor and <\/span><em><span style=\"font-weight: 400;\">getSentiment <\/span><\/em><span style=\"font-weight: 400;\">method) we created in Step 2 and then uploaded to the Analytics server in Step 3. Those are now referenced in the following user-defined function:<\/span><\/p>\n<pre class=\"\">CREATE ANALYTICS FUNCTION getReviewSentiment(text) AS \"sentiment\", \"Model.getSentiment\" \r\nAT sentimentlibrary;<\/pre>\n<p><span style=\"font-weight: 400;\">Create the Analytics UDF in the same location (<\/span><em><span style=\"font-weight: 400;\">sentimentlibrary<\/span><\/em><span style=\"font-weight: 400;\">) as specified in the <\/span><span style=\"font-weight: 400;\">curl <\/span><span style=\"font-weight: 400;\">function.<\/span><\/p>\n<h4><span style=\"font-weight: 400;\">Invoking the UDFs<\/span><\/h4>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Harnessing the capabilities of N1QL, we can now write predictive queries within Couchbase Analytics to derive powerful insights from our UDFs. Under the covers, when invoking this UDF it calls the underlying <\/span><b>Model <\/b><span style=\"font-weight: 400;\">method which iterates over each row to do the sentiment analysis. The following is a basic example of such a query, but the possibilities are truly endless.<\/span><\/p>\n<pre class=\"\">USE Default;\r\nSELECT getReviewSentiment(r.review_content) AS sentiment, COUNT(*) AS sentimentCount\r\nFROM movie_reviews r, movies m\r\nWHERE m.rotten_tomatoes_link = r.rotten_tomatoes_link\r\nGROUP BY getReviewSentiment(r.review_content)\r\nORDER BY sentimentCount DESC;<\/pre>\n<p><span style=\"font-weight: 400;\">With such a query you will get results like the following:<\/span><\/p>\n<pre class=\"\">[\r\n{\r\n\"sentimentCount\": 10105,\r\n\"sentiment\": \"Fresh\"\r\n},\r\n{\r\n\"sentimentCount\": 7601,\r\n\"sentiment\": \"Rotten\"\r\n}\r\n]<\/pre>\n<p><span style=\"font-weight: 400;\">We now have an ordered count of positive, neutral, and negative sentiments as defined by our trained model.<\/span><\/p>\n<h4><span style=\"font-weight: 400;\">Conclusion<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">Congrats, you just set up the needed Couchbase Server environment on Docker and successfully ran your first User Defined Function on Couchbase Analytics. As you can see, the integration of your Python ML models with UDFs and Couchbase Analytics promises to be an effective way of extracting valuable information from your data without compromising on performance or efficiency.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Please feel free to share any questions or feedback in the comments below or via a post in <\/span><a href=\"https:\/\/www.couchbase.com\/forums\/\"><span style=\"font-weight: 400;\">Couchbase Forums<\/span><\/a><span style=\"font-weight: 400;\">. We can\u2019t wait to see how you\u2019ll combine the power of ML and NoSQL for your enterprise.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Want to learn more about Couchbase Analytics watch our Connect Session: <\/span><a href=\"https:\/\/www.youtube.com\/watch?v=nyHUKfTMKDQ\"><span style=\"font-weight: 400;\">Machine Learning Meets NoSQL: Python UDFs<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><iframe loading=\"lazy\" title=\"Machine Learning Meets NoSQL: Python UDFs - CBConnect21\" width=\"900\" height=\"506\" src=\"https:\/\/www.youtube.com\/embed\/nyHUKfTMKDQ?feature=oembed&#038;enablejsapi=1&#038;origin=https:\/\/www.couchbase.com\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe><\/p>\n<p><span style=\"font-weight: 400;\">Here is a summary of the links and topics mentioned in this post:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/www.couchbase.com\/blog\/ml-meets-nosql-integrating-python-user-defined-functions-with-n1ql-for-analytics\/\"><span style=\"font-weight: 400;\">Part 1 &#8211; ML Meets NoSQL: Integrating Python User-Defined Functions with N1QL for Analytics<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/github.com\/couchbaselabs\/AnalyticsML\"><span style=\"font-weight: 400;\">Couchbase AnalyticsML GitHub repository<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/www.kaggle.com\/stefanoleone992\/rotten-tomatoes-movies-and-critic-reviews-dataset\"><span style=\"font-weight: 400;\">Kaggle dataset of Rotten Tomatoes reviews<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/docs.couchbase.com\/server\/current\/analytics\/9_udf.html\"><span style=\"font-weight: 400;\">Couchbase User-defined Functions documentation<\/span><\/a><\/li>\n<\/ul>\n<p><b data-stringify-type=\"bold\">Acknowledgments<\/b><br \/>\nThanks to\u00a0<b data-stringify-type=\"bold\">Anuj Kothari,\u00a0<\/b>a summer Product Management Intern for Couchbase Analytics service, who\u2019s initial efforts got this started and off the ground last summer. Thanks to\u00a0<b data-stringify-type=\"bold\">Idris Motiwala<\/b>, Principal Product Manager on the Couchbase Analytics Service, and\u00a0<b data-stringify-type=\"bold\">Ian Maxon<\/b>, a software engineer for the Couchbase Analytics Service, for their editorial work in making this a more functional blog.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>With Couchbase 7.0 you&#8217;re now capable of allowing integration of Python UDFs with Couchbase Analytics. In Part 1 of this blog series, we covered the essentials for getting Couchbase and the Analytics for Machine Learning (ML) set up. ML has [&hellip;]<\/p>\n","protected":false},"author":79257,"featured_media":12627,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[2294,9139,2201],"tags":[2140,1725],"ppma_author":[9482],"class_list":["post-12792","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","category-python","category-tools-sdks","tag-machine-learning","tag-nosql-database"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Leveraging your ML models with Couchbase Analytics User Defined Functions (UDF) - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"In this blog post we walk you though to show you how to apply external algorithms to data that is resident in Couchbase.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/ko\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Leveraging your ML models with Couchbase Analytics User Defined Functions (UDF)\" \/>\n<meta property=\"og:description\" content=\"In this blog post we walk you though to show you how to apply external algorithms to data that is resident in Couchbase.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-02-16T16:34:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T04:25:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/12\/simon-abrams-k_T9Zj3SE8k-unsplash-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1706\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Muk Sreenivasan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Muk Sreenivasan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\\\/\"},\"author\":{\"name\":\"Muk Sreenivasan\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/b37fc76b5459210102cef15674423031\"},\"headline\":\"Leveraging your ML models with Couchbase Analytics User Defined Functions (UDF)\",\"datePublished\":\"2022-02-16T16:34:12+00:00\",\"dateModified\":\"2025-06-14T04:25:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\\\/\"},\"wordCount\":1514,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2021\\\/12\\\/simon-abrams-k_T9Zj3SE8k-unsplash-scaled.jpg\",\"keywords\":[\"Machine Learning (ML)\",\"NoSQL Database\"],\"articleSection\":[\"Couchbase Analytics\",\"Python\",\"Tools &amp; SDKs\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\\\/\",\"name\":\"Leveraging your ML models with Couchbase Analytics User Defined Functions (UDF) - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2021\\\/12\\\/simon-abrams-k_T9Zj3SE8k-unsplash-scaled.jpg\",\"datePublished\":\"2022-02-16T16:34:12+00:00\",\"dateModified\":\"2025-06-14T04:25:06+00:00\",\"description\":\"In this blog post we walk you though to show you how to apply external algorithms to data that is resident in Couchbase.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\\\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2021\\\/12\\\/simon-abrams-k_T9Zj3SE8k-unsplash-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2021\\\/12\\\/simon-abrams-k_T9Zj3SE8k-unsplash-scaled.jpg\",\"width\":2560,\"height\":1706,\"caption\":\"Couchbase Capella 2 years!\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Leveraging your ML models with Couchbase Analytics User Defined Functions (UDF)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/admin-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/b37fc76b5459210102cef15674423031\",\"name\":\"Muk Sreenivasan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/03\\\/muk_sreenivasan.png194f54236bbc53ba3b1b5550c654d008\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/03\\\/muk_sreenivasan.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/03\\\/muk_sreenivasan.png\",\"caption\":\"Muk Sreenivasan\"},\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ko\\\/author\\\/muk-sreenivasan\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Leveraging your ML models with Couchbase Analytics User Defined Functions (UDF) - The Couchbase Blog","description":"\uc774 \ube14\ub85c\uadf8 \uac8c\uc2dc\ubb3c\uc5d0\uc11c\ub294 Couchbase\uc5d0 \uc0c1\uc8fc\ud558\ub294 \ub370\uc774\ud130\uc5d0 \uc678\ubd80 \uc54c\uace0\ub9ac\uc998\uc744 \uc801\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc548\ub0b4\ud569\ub2c8\ub2e4.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/ko\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/","og_locale":"ko_KR","og_type":"article","og_title":"Leveraging your ML models with Couchbase Analytics User Defined Functions (UDF)","og_description":"In this blog post we walk you though to show you how to apply external algorithms to data that is resident in Couchbase.","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/","og_site_name":"The Couchbase Blog","article_published_time":"2022-02-16T16:34:12+00:00","article_modified_time":"2025-06-14T04:25:06+00:00","og_image":[{"width":2560,"height":1706,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/12\/simon-abrams-k_T9Zj3SE8k-unsplash-scaled.jpg","type":"image\/jpeg"}],"author":"Muk Sreenivasan","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Muk Sreenivasan","Est. reading time":"8\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/"},"author":{"name":"Muk Sreenivasan","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b37fc76b5459210102cef15674423031"},"headline":"Leveraging your ML models with Couchbase Analytics User Defined Functions (UDF)","datePublished":"2022-02-16T16:34:12+00:00","dateModified":"2025-06-14T04:25:06+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/"},"wordCount":1514,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/12\/simon-abrams-k_T9Zj3SE8k-unsplash-scaled.jpg","keywords":["Machine Learning (ML)","NoSQL Database"],"articleSection":["Couchbase Analytics","Python","Tools &amp; SDKs"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/","url":"https:\/\/www.couchbase.com\/blog\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/","name":"Leveraging your ML models with Couchbase Analytics User Defined Functions (UDF) - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/12\/simon-abrams-k_T9Zj3SE8k-unsplash-scaled.jpg","datePublished":"2022-02-16T16:34:12+00:00","dateModified":"2025-06-14T04:25:06+00:00","description":"\uc774 \ube14\ub85c\uadf8 \uac8c\uc2dc\ubb3c\uc5d0\uc11c\ub294 Couchbase\uc5d0 \uc0c1\uc8fc\ud558\ub294 \ub370\uc774\ud130\uc5d0 \uc678\ubd80 \uc54c\uace0\ub9ac\uc998\uc744 \uc801\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc548\ub0b4\ud569\ub2c8\ub2e4.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/12\/simon-abrams-k_T9Zj3SE8k-unsplash-scaled.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/12\/simon-abrams-k_T9Zj3SE8k-unsplash-scaled.jpg","width":2560,"height":1706,"caption":"Couchbase Capella 2 years!"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/leveraging-your-ml-models-with-couchbase-analytics-user-defined-functions-udf\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Leveraging your ML models with Couchbase Analytics User Defined Functions (UDF)"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","description":"NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4, Couchbase","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b37fc76b5459210102cef15674423031","name":"\ubb35 \uc2a4\ub9ac\ub2c8\ubc14\uc0b0","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/muk_sreenivasan.png194f54236bbc53ba3b1b5550c654d008","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/muk_sreenivasan.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/muk_sreenivasan.png","caption":"Muk Sreenivasan"},"url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/muk-sreenivasan\/"}]}},"acf":[],"authors":[{"term_id":9482,"user_id":79257,"is_guest":0,"slug":"muk-sreenivasan","display_name":"Muk Sreenivasan","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/muk_sreenivasan.png","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/muk_sreenivasan.png"},"0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/12792","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/users\/79257"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=12792"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/12792\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/12627"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=12792"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=12792"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=12792"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=12792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}