| <!DOCTYPE html><html><head><title>Quick Start - E-Commerce Recommendation Engine Template</title><meta charset="utf-8"/><meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta class="swiftype" name="title" data-type="string" content="Quick Start - E-Commerce Recommendation Engine Template"/><link rel="canonical" href="https://docs.prediction.io/templates/ecommercerecommendation/quickstart/"/><link href="/images/favicon/normal-b330020a.png" rel="shortcut icon"/><link href="/images/favicon/apple-c0febcf2.png" rel="apple-touch-icon"/><link href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet"/><link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet"/><link href="/stylesheets/application-3598c7d7.css" rel="stylesheet" type="text/css"/><script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js"></script><script src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script><script src="//use.typekit.net/pqo0itb.js"></script><script>try{Typekit.load({ async: true });}catch(e){}</script></head><body><div id="global"><header><div class="container" id="header-wrapper"><div class="row"><div class="col-sm-12"><div id="logo-wrapper"><span id="drawer-toggle"></span><a href="#"></a><a href="http://predictionio.incubator.apache.org/"><img alt="PredictionIO" id="logo" src="/images/logos/logo-ee2b9bb3.png"/></a></div><div id="menu-wrapper"><div id="header-nav-options-wrapper"><ul><li><a href="/">Install & Doc</a></li> <li><a href="/support">Support</a></li> </ul></div><div id="pill-wrapper"><a class="pill left" href="//templates.prediction.io/">TEMPLATES</a> <a class="pill right" href="//github.com/apache/incubator-predictionio/">OPEN SOURCE</a></div></div><img class="mobile-search-bar-toggler hidden-md hidden-lg" src="/images/icons/search-glass-704bd4ff.png"/></div></div></div></header><div id="search-bar-row-wrapper"><div class="container-fluid" id="search-bar-row"><div class="row"><div class="col-md-9 col-sm-11 col-xs-11"><div class="hidden-md hidden-lg" id="mobile-page-heading-wrapper"><p>PredictionIO Docs</p><h4>Quick Start - E-Commerce Recommendation Engine Template</h4></div><h4 class="hidden-sm hidden-xs">PredictionIO Docs</h4></div><div class="col-md-3 col-sm-1 col-xs-1 hidden-md hidden-lg"><img id="left-menu-indicator" src="/images/icons/down-arrow-dfe9f7fe.png"/></div><div class="col-md-3 col-sm-12 col-xs-12 swiftype-wrapper"><div class="swiftype"><form class="search-form"><img class="search-box-toggler hidden-xs hidden-sm" src="/images/icons/search-glass-704bd4ff.png"/><div class="search-box"><img src="/images/icons/search-glass-704bd4ff.png"/><input type="text" id="st-search-input" class="st-search-input" placeholder="Search Doc..."/></div><img class="swiftype-row-hider hidden-md hidden-lg" src="/images/icons/drawer-toggle-active-fcbef12a.png"/></form></div></div><div class="mobile-left-menu-toggler hidden-md hidden-lg"></div></div></div></div><div id="page" class="container-fluid"><div class="row"><div id="left-menu-wrapper" class="col-md-3"><nav id="nav-main"><ul><li class="level-1"><a class="expandible" href="/"><span>Apache PredictionIO (incubating) Documentation</span></a><ul><li class="level-2"><a class="final" href="/"><span>Welcome to Apache PredictionIO (incubating)</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Getting Started</span></a><ul><li class="level-2"><a class="final" href="/start/"><span>A Quick Intro</span></a></li><li class="level-2"><a class="final" href="/install/"><span>Installing Apache PredictionIO (incubating)</span></a></li><li class="level-2"><a class="final" href="/start/download/"><span>Downloading an Engine Template</span></a></li><li class="level-2"><a class="final" href="/start/deploy/"><span>Deploying Your First Engine</span></a></li><li class="level-2"><a class="final" href="/start/customize/"><span>Customizing the Engine</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Integrating with Your App</span></a><ul><li class="level-2"><a class="final" href="/appintegration/"><span>App Integration Overview</span></a></li><li class="level-2"><a class="expandible" href="/sdk/"><span>List of SDKs</span></a><ul><li class="level-3"><a class="final" href="/sdk/java/"><span>Java & Android SDK</span></a></li><li class="level-3"><a class="final" href="/sdk/php/"><span>PHP SDK</span></a></li><li class="level-3"><a class="final" href="/sdk/python/"><span>Python SDK</span></a></li><li class="level-3"><a class="final" href="/sdk/ruby/"><span>Ruby SDK</span></a></li><li class="level-3"><a class="final" href="/sdk/community/"><span>Community Powered SDKs</span></a></li></ul></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Deploying an Engine</span></a><ul><li class="level-2"><a class="final" href="/deploy/"><span>Deploying as a Web Service</span></a></li><li class="level-2"><a class="final" href="/cli/#engine-commands"><span>Engine Command-line Interface</span></a></li><li class="level-2"><a class="final" href="/deploy/engineparams/"><span>Setting Engine Parameters</span></a></li><li class="level-2"><a class="final" href="/deploy/enginevariants/"><span>Deploying Multiple Engine Variants</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Customizing an Engine</span></a><ul><li class="level-2"><a class="final" href="/customize/"><span>Learning DASE</span></a></li><li class="level-2"><a class="final" href="/customize/dase/"><span>Implement DASE</span></a></li><li class="level-2"><a class="final" href="/customize/troubleshooting/"><span>Troubleshooting Engine Development</span></a></li><li class="level-2"><a class="final" href="/api/current/#package"><span>Engine Scala APIs</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Collecting and Analyzing Data</span></a><ul><li class="level-2"><a class="final" href="/datacollection/"><span>Event Server Overview</span></a></li><li class="level-2"><a class="final" href="/cli/#event-server-commands"><span>Event Server Command-line Interface</span></a></li><li class="level-2"><a class="final" href="/datacollection/eventapi/"><span>Collecting Data with REST/SDKs</span></a></li><li class="level-2"><a class="final" href="/datacollection/eventmodel/"><span>Events Modeling</span></a></li><li class="level-2"><a class="final" href="/datacollection/webhooks/"><span>Unifying Multichannel Data with Webhooks</span></a></li><li class="level-2"><a class="final" href="/datacollection/channel/"><span>Channel</span></a></li><li class="level-2"><a class="final" href="/datacollection/batchimport/"><span>Importing Data in Batch</span></a></li><li class="level-2"><a class="final" href="/datacollection/analytics/"><span>Using Analytics Tools</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Choosing an Algorithm(s)</span></a><ul><li class="level-2"><a class="final" href="/algorithm/"><span>Built-in Algorithm Libraries</span></a></li><li class="level-2"><a class="final" href="/algorithm/switch/"><span>Switching to Another Algorithm</span></a></li><li class="level-2"><a class="final" href="/algorithm/multiple/"><span>Combining Multiple Algorithms</span></a></li><li class="level-2"><a class="final" href="/algorithm/custom/"><span>Adding Your Own Algorithms</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>ML Tuning and Evaluation</span></a><ul><li class="level-2"><a class="final" href="/evaluation/"><span>Overview</span></a></li><li class="level-2"><a class="final" href="/evaluation/paramtuning/"><span>Hyperparameter Tuning</span></a></li><li class="level-2"><a class="final" href="/evaluation/evaluationdashboard/"><span>Evaluation Dashboard</span></a></li><li class="level-2"><a class="final" href="/evaluation/metricchoose/"><span>Choosing Evaluation Metrics</span></a></li><li class="level-2"><a class="final" href="/evaluation/metricbuild/"><span>Building Evaluation Metrics</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>System Architecture</span></a><ul><li class="level-2"><a class="final" href="/system/"><span>Architecture Overview</span></a></li><li class="level-2"><a class="final" href="/system/anotherdatastore/"><span>Using Another Data Store</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Engine Template Gallery</span></a><ul><li class="level-2"><a class="final" href="http://templates.prediction.io"><span>Browse</span></a></li><li class="level-2"><a class="final" href="/community/submit-template/"><span>Submit your Engine as a Template</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Demo Tutorials</span></a><ul><li class="level-2"><a class="final" href="/demo/tapster/"><span>Comics Recommendation Demo</span></a></li><li class="level-2"><a class="final" href="/demo/community/"><span>Community Contributed Demo</span></a></li><li class="level-2"><a class="final" href="/demo/textclassification/"><span>Text Classification Engine Tutorial</span></a></li></ul></li><li class="level-1"><a class="expandible" href="/community/"><span>Getting Involved</span></a><ul><li class="level-2"><a class="final" href="/community/contribute-code/"><span>Contribute Code</span></a></li><li class="level-2"><a class="final" href="/community/contribute-documentation/"><span>Contribute Documentation</span></a></li><li class="level-2"><a class="final" href="/community/contribute-sdk/"><span>Contribute a SDK</span></a></li><li class="level-2"><a class="final" href="/community/contribute-webhook/"><span>Contribute a Webhook</span></a></li><li class="level-2"><a class="final" href="/community/projects/"><span>Community Projects</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Getting Help</span></a><ul><li class="level-2"><a class="final" href="/resources/faq/"><span>FAQs</span></a></li><li class="level-2"><a class="final" href="/support/"><span>Community Support</span></a></li><li class="level-2"><a class="final" href="/support/#enterprise-support"><span>Enterprise Support</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Resources</span></a><ul><li class="level-2"><a class="final" href="/resources/intellij/"><span>Developing Engines with IntelliJ IDEA</span></a></li><li class="level-2"><a class="final" href="/resources/upgrade/"><span>Upgrade Instructions</span></a></li><li class="level-2"><a class="final" href="/resources/glossary/"><span>Glossary</span></a></li></ul></li></ul></nav></div><div class="col-md-9 col-sm-12"><div class="content-header hidden-md hidden-lg"><div id="page-title"><h1>Quick Start - E-Commerce Recommendation Engine Template</h1></div></div><div id="table-of-content-wrapper"><h5>On this page</h5><aside id="table-of-contents"><ul> <li> <a href="#overview">Overview</a> </li> <li> <a href="#usage">Usage</a> </li> <li> <a href="#1-install-and-run-predictionio">1. Install and Run PredictionIO</a> </li> <li> <a href="#2-create-a-new-engine-from-an-engine-template">2. Create a new Engine from an Engine Template</a> </li> <li> <a href="#3-generate-an-app-id-and-access-key">3. Generate an App ID and Access Key</a> </li> <li> <a href="#4-collecting-data">4. Collecting Data</a> </li> <li> <a href="#5-deploy-the-engine-as-a-service">5. Deploy the Engine as a Service</a> </li> <li> <a href="#6-use-the-engine">6. Use the Engine</a> </li> <li> <a href="#setting-constraint-unavailableitems">Setting constraint "unavailableItems"</a> </li> <li> <a href="#advanced-query">Advanced Query</a> </li> </ul> </aside><hr/><a id="edit-page-link" href="https://github.com/apache/incubator-predictionio/tree/livedoc/docs/manual/source/templates/ecommercerecommendation/quickstart.html.md.erb"><img src="/images/icons/edit-pencil-d6c1bb3d.png"/>Edit this page</a></div><div class="content-header hidden-sm hidden-xs"><div id="page-title"><h1>Quick Start - E-Commerce Recommendation Engine Template</h1></div></div><div class="content"><h2 id='overview' class='header-anchors'>Overview</h2><p>This engine template provides personalized recommendation for e-commerce applications with the following features by default:</p> <ul> <li>Exclude out-of-stock items</li> <li>Provide recommendation to new users who sign up after the model is trained</li> <li>Recommend unseen items only (configurable)</li> <li>Recommend popular items if no information about the user is available (added in template version v0.4.0)</li> </ul> <div class="alert-message warning"><p>This template requires PredictionIO version >= 0.9.0</p></div><h2 id='usage' class='header-anchors'>Usage</h2><h3 id='event-data-requirements' class='header-anchors'>Event Data Requirements</h3><p>By default, this template takes the following data from Event Server:</p> <ul> <li>Users' <em>view</em> events</li> <li>Users' <em>buy</em> events</li> <li>Items' with <em>categories</em> properties</li> <li>Constraint <em>unavailableItems</em> set events</li> </ul> <div class="alert-message info"><p>This template can easily be customized to consider more user events such as <em>rate</em> and <em>like</em>.</p></div><p>The <em>view</em> events are used as Training Data to train the model. The algorithm has a parameter <em>unseenOnly</em>; when this parameter is set to true, the engine would recommend unseen items only. You can specify a list of events which are considered as <em>seen</em> events with the algorithm parameter <em>seenEvents</em>. The default values are <em>view</em> and <em>buy</em> events, which means that the engine by default recommends un-viewed and un-bought items only. You can also define your own events which are considered as <em>seen</em>.</p><p>The constraint <em>unavailableItems</em> set events are used to exclude a list of unaviable items (such as out of stock) for all users in real time.</p><h3 id='input-query' class='header-anchors'>Input Query</h3> <ul> <li>UserID</li> <li>Num of items to be recommended</li> <li>List of white-listed item categories (optional)</li> <li>List of white-listed ItemIds (optional)</li> <li>List of black-listed ItemIds (optional)</li> </ul> <p>The template also supports black-list and whitelist. If a whitelist is provided, the engine will include only those products in the recommendation. Likewise, if a blacklist is provided, the engine will exclude those products in the recommendation.</p><h3 id='output-predictedresult' class='header-anchors'>Output PredictedResult</h3> <ul> <li>A ranked list of recommended itemIDs</li> </ul> <h2 id='1.-install-and-run-predictionio' class='header-anchors'>1. Install and Run PredictionIO</h2><p>First you need to <a href="/install">install PredictionIO 0.9.6</a> (if you haven't done it).</p><p>Let's say you have installed PredictionIO at <code>/home/yourname/PredictionIO/</code>. For convenience, add PredictionIO's binary command path to your <code>PATH</code>, i.e. <code>/home/yourname/PredictionIO/bin</code>:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ </span><span class="nv">PATH</span><span class="o">=</span><span class="nv">$PATH</span>:/home/yourname/PredictionIO/bin; <span class="nb">export </span>PATH |
| </pre></td></tr></tbody></table> </div> <div class="alert-message note"><p>If you launched <strong>PredictionIO AWS instance</strong>, the path is located at <code>/opt/PredictionIO/bin</code>.</p></div><p>Once you have completed the installation process, please make sure all the components (PredictionIO Event Server, Elasticsearch, and HBase) are up and running.</p><div class="alert-message note"><p>If you launched <strong>PredictionIO AWS instance</strong>, you can skip <code>pio-start-all</code>. All components should have been started automatically.</p></div><p>If you are using PostgreSQL or MySQL, run the following to start PredictionIO Event Server:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ </span>pio eventserver & |
| </pre></td></tr></tbody></table> </div> <p>If instead you are running HBase and Elasticsearch, run the following to start all PredictionIO Event Server, HBase, and Elasticsearch:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ </span>pio-start-all |
| </pre></td></tr></tbody></table> </div> <p>You can check the status by running:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ </span>pio status |
| </pre></td></tr></tbody></table> </div> <p>If everything is OK, you should see the following outputs:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4</pre></td><td class="code"><pre>... |
| |
| <span class="o">(</span>sleeping 5 seconds <span class="k">for </span>all messages to show up...<span class="o">)</span> |
| Your system is all ready to go. |
| </pre></td></tr></tbody></table> </div> <div class="alert-message note"><p>To further troubleshoot, please see <a href="/resources/faq/#using-predictionio">FAQ - Using PredictionIO</a>.</p></div> <p><a href="#"></a></p> <h2 id='2.-create-a-new-engine-from-an-engine-template' class='header-anchors'>2. Create a new Engine from an Engine Template</h2><p>Now let's create a new engine called <em>MyECommerceRecommendation</em> by downloading the E-Commerce Recommendation Engine Template. Go to a directory where you want to put your engine and run the following:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2</pre></td><td class="code"><pre><span class="gp">$ </span>pio template get PredictionIO/template-scala-parallel-ecommercerecommendation MyECommerceRecommendation |
| <span class="gp">$ </span><span class="nb">cd </span>MyECommerceRecommendation |
| </pre></td></tr></tbody></table> </div> <p>A new directory <em>MyECommerceRecommendation</em> is created, where you can find the downloaded engine template.</p> <p><a href="#"></a></p> <h2 id='3.-generate-an-app-id-and-access-key' class='header-anchors'>3. Generate an App ID and Access Key</h2><p>You will need to create a new App in PredictionIO to store all the data of your app. The data collected will be used for machine learning modeling.</p><p>Let's assume you want to use this engine in an application named "MyApp1". Run the following to create a new app "MyApp1":</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ </span>pio app new MyApp1 |
| </pre></td></tr></tbody></table> </div> <p>You should find the following in the console output:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6</pre></td><td class="code"><pre>... |
| <span class="o">[</span>INFO] <span class="o">[</span>App<span class="nv">$]</span> Initialized Event Store <span class="k">for </span>this app ID: 1. |
| <span class="o">[</span>INFO] <span class="o">[</span>App<span class="nv">$]</span> Created new app: |
| <span class="o">[</span>INFO] <span class="o">[</span>App<span class="nv">$]</span> Name: MyApp1 |
| <span class="o">[</span>INFO] <span class="o">[</span>App<span class="nv">$]</span> ID: 1 |
| <span class="o">[</span>INFO] <span class="o">[</span>App<span class="nv">$]</span> Access Key: 3mZWDzci2D5YsqAnqNnXH9SB6Rg3dsTBs8iHkK6X2i54IQsIZI1eEeQQyMfs7b3F |
| </pre></td></tr></tbody></table> </div> <p>Note that <em>App ID</em><em>, **Access Key</em>* are created for this App "MyApp1". You will need the <strong>Access Key</strong> when you collect data with EventServer for this App.</p><p>You can list all of the apps created its corresponding ID and Access Key by running the following command:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ </span>pio app list |
| </pre></td></tr></tbody></table> </div> <p>You should see a list of apps created. For example:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4</pre></td><td class="code"><pre><span class="o">[</span>INFO] <span class="o">[</span>App<span class="nv">$]</span> Name | ID | Access Key | Allowed Event<span class="o">(</span>s<span class="o">)</span> |
| <span class="o">[</span>INFO] <span class="o">[</span>App<span class="nv">$]</span> MyApp1 | 1 | 3mZWDzci2D5YsqAnqNnXH9SB6Rg3dsTBs8iHkK6X2i54IQsIZI1eEeQQyMfs7b3F | <span class="o">(</span>all<span class="o">)</span> |
| <span class="o">[</span>INFO] <span class="o">[</span>App<span class="nv">$]</span> MyApp2 | 2 | io5lz6Eg4m3Xe4JZTBFE13GMAf1dhFl6ZteuJfrO84XpdOz9wRCrDU44EUaYuXq5 | <span class="o">(</span>all<span class="o">)</span> |
| <span class="o">[</span>INFO] <span class="o">[</span>App<span class="nv">$]</span> Finished listing 2 app<span class="o">(</span>s<span class="o">)</span>. |
| </pre></td></tr></tbody></table> </div> <p><a href="#"></a></p> <h2 id='4.-collecting-data' class='header-anchors'>4. Collecting Data</h2><p>Next, let's collect training data for this Engine. By default, the E-Commerce Recommendation Engine Template supports 2 types of entities and 2 events: <strong>user</strong> and <strong>item</strong>; events <strong>view</strong> and <strong>buy</strong>. An item has the <strong>categories</strong> property, which is a list of category names (String). A user can view and buy an item. The specical <strong>constraint</strong> entiy with entityId <strong>unavailableItems</strong> defines a list of unavailable items and is taken into account in realtime during serving.</p><p>In summary, this template requires '$set' user event, '$set' item event, user-view-item events, user-buy-item event and '$set' constraint event.</p><div class="alert-message info"><p>This template can easily be customized to consider other user-to-item events.</p></div><p>You can send these events to PredictionIO Event Server in real-time easily by making a HTTP request or through the provided SDK. Please see <a href="/appintegration/">App Integration Overview</a> for more details how to integrate your app with SDK.</p><p>Let's try sending events to EventServer with the following <code>curl</code> commands (The corresponding SDK code is showed in other tabs).</p><p>Replace <code><ACCCESS_KEY></code> by the Access Key generated in above steps. Note that <code>localhost:7070</code> is the default URL of the Event Server.</p><p>For convenience, set your access key to the shell variable, run:</p><p><code>$ ACCESS_KEY=<ACCESS_KEY></code></p> <p><a href="#"></a></p> <p>For example, when a new user with id "u0" is created in your app on time <code>2014-11-02T09:39:45.618-08:00</code> (current time will be used if eventTime is not specified), you can send a <code>$set</code> event for this user. To send this event, run the following <code>curl</code> command:</p><div class="tabs"> <ul class="control"> <li data-lang="json"><a href="#tab-1bab9bb6-ba75-449f-9792-8415752777cd">REST API</a></li> <li data-lang="python"><a href="#tab-9acc7351-dc98-4e1f-8562-c2b800a724c1">Python SDK</a></li> <li data-lang="php"><a href="#tab-e404faba-025f-4bcf-8d13-57455eb17f96">PHP SDK</a></li> <li data-lang="ruby"><a href="#tab-1c953526-e1ee-416a-851d-e843f1221c23">Ruby SDK</a></li> <li data-lang="java"><a href="#tab-841fa5d7-4795-469c-9408-5727bf629f6d">Java SDK</a></li> </ul> <div data-tab="REST API" data-lang="json" id="tab-1bab9bb6-ba75-449f-9792-8415752777cd"> <div class="highlight shell"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8</pre></td> <td class="code"><pre><span class="gp">$ </span>curl -i -X POST http://localhost:7070/events.json?accessKey<span class="o">=</span><span class="nv">$ACCESS_KEY</span> <span class="se">\</span> |
| -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span> |
| -d <span class="s1">'{ |
| "event" : "$set", |
| "entityType" : "user" |
| "entityId" : "u0", |
| "eventTime" : "2014-11-02T09:39:45.618-08:00" |
| }'</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Python SDK" data-lang="python" id="tab-9acc7351-dc98-4e1f-8562-c2b800a724c1"> <div class="highlight python"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 16</pre></td> <td class="code"><pre><span class="kn">import</span> <span class="nn">predictionio</span> |
| |
| <span class="n">client</span> <span class="o">=</span> <span class="n">predictionio</span><span class="o">.</span><span class="n">EventClient</span><span class="p">(</span> |
| <span class="n">access_key</span><span class="o">=<</span><span class="n">ACCESS</span> <span class="n">KEY</span><span class="o">></span><span class="p">,</span> |
| <span class="n">url</span><span class="o">=<</span><span class="n">URL</span> <span class="n">OF</span> <span class="n">EVENTSERVER</span><span class="o">></span><span class="p">,</span> |
| <span class="n">threads</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> |
| <span class="n">qsize</span><span class="o">=</span><span class="mi">500</span> |
| <span class="p">)</span> |
| |
| <span class="c"># Create a new user</span> |
| |
| <span class="n">client</span><span class="o">.</span><span class="n">create_event</span><span class="p">(</span> |
| <span class="n">event</span><span class="o">=</span><span class="s">"$set"</span><span class="p">,</span> |
| <span class="n">entity_type</span><span class="o">=</span><span class="s">"user"</span><span class="p">,</span> |
| <span class="n">entity_id</span><span class="o">=<</span><span class="n">USER_ID</span><span class="o">></span> |
| <span class="p">)</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="PHP SDK" data-lang="php" id="tab-e404faba-025f-4bcf-8d13-57455eb17f96"> <div class="highlight php"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 16 |
| 17 |
| 18 |
| 19 |
| 20 |
| 21</pre></td> <td class="code"><pre><span class="cp"><?php</span> |
| <span class="k">require_once</span><span class="p">(</span><span class="s2">"vendor/autoload.php"</span><span class="p">);</span> |
| <span class="k">use</span> <span class="nx">predictionio\EventClient</span><span class="p">;</span> |
| |
| <span class="nv">$client</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">EventClient</span><span class="p">(</span><span class="o"><</span><span class="nx">ACCESS</span> <span class="nx">KEY</span><span class="o">></span><span class="p">,</span> <span class="o"><</span><span class="nx">URL</span> <span class="nx">OF</span> <span class="nx">EVENTSERVER</span><span class="o">></span><span class="p">);</span> |
| |
| <span class="c1">// Create a new user |
| </span><span class="nv">$client</span><span class="o">-></span><span class="na">createEvent</span><span class="p">(</span><span class="k">array</span><span class="p">(</span> |
| <span class="s1">'event'</span> <span class="o">=></span> <span class="s1">'$set'</span><span class="p">,</span> |
| <span class="s1">'entityType'</span> <span class="o">=></span> <span class="s1">'user'</span><span class="p">,</span> |
| <span class="s1">'entityId'</span> <span class="o">=></span> <span class="o"><</span><span class="nx">USER</span> <span class="nx">ID</span><span class="o">></span> |
| <span class="p">));</span> |
| |
| <span class="c1">// Create a new item or set existing item's categories |
| </span><span class="nv">$client</span><span class="o">-></span><span class="na">createEvent</span><span class="p">(</span><span class="k">array</span><span class="p">(</span> |
| <span class="s1">'event'</span> <span class="o">=></span> <span class="s1">'$set'</span><span class="p">,</span> |
| <span class="s1">'entityType'</span> <span class="o">=></span> <span class="s1">'item'</span><span class="p">,</span> |
| <span class="s1">'entityId'</span> <span class="o">=></span> <span class="o"><</span><span class="nx">ITEM</span> <span class="nx">ID</span><span class="o">></span> |
| <span class="s1">'properties'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span><span class="s1">'categories'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span><span class="s1">'<CATEGORY_1>'</span><span class="p">,</span> <span class="s1">'<CATEGORY_2>'</span><span class="p">))</span> |
| <span class="p">));</span> |
| <span class="cp">?></span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Ruby SDK" data-lang="ruby" id="tab-1c953526-e1ee-416a-851d-e843f1221c23"> <div class="highlight ruby"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9</pre></td> <td class="code"><pre><span class="c1"># Create a client object.</span> |
| <span class="n">client</span> <span class="o">=</span> <span class="no">PredictionIO</span><span class="o">::</span><span class="no">EventClient</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="o"><</span><span class="no">ACCESS</span> <span class="no">KEY</span><span class="o">></span><span class="p">,</span> <span class="o"><</span><span class="no">URL</span> <span class="no">OF</span> <span class="no">EVENTSERVER</span><span class="o">></span><span class="p">)</span> |
| |
| <span class="c1"># Create a new user</span> |
| <span class="n">client</span><span class="p">.</span><span class="nf">create_event</span><span class="p">(</span> |
| <span class="s1">'$set'</span><span class="p">,</span> |
| <span class="s1">'user'</span><span class="p">,</span> |
| <span class="o"><</span><span class="no">USER</span> <span class="no">ID</span><span class="o">></span> |
| <span class="p">)</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Java SDK" data-lang="java" id="tab-841fa5d7-4795-469c-9408-5727bf629f6d"> <div class="highlight java"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13</pre></td> <td class="code"><pre><span class="kn">import</span> <span class="nn">io.prediction.Event</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">io.prediction.EventClient</span><span class="o">;</span> |
| |
| <span class="kn">import</span> <span class="nn">com.google.common.collect.ImmutableList</span><span class="o">;</span> |
| |
| <span class="n">EventClient</span> <span class="n">client</span> <span class="o">=</span> <span class="k">new</span> <span class="n">EventClient</span><span class="o">(<</span><span class="n">ACCESS</span> <span class="n">KEY</span><span class="o">>,</span> <span class="o"><</span><span class="n">URL</span> <span class="n">OF</span> <span class="n">EVENTSERVER</span><span class="o">>);</span> |
| |
| <span class="c1">// Create a new user</span> |
| <span class="n">Event</span> <span class="n">userEvent</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Event</span><span class="o">()</span> |
| <span class="o">.</span><span class="na">event</span><span class="o">(</span><span class="s">"$set"</span><span class="o">)</span> |
| <span class="o">.</span><span class="na">entityType</span><span class="o">(</span><span class="s">"user"</span><span class="o">)</span> |
| <span class="o">.</span><span class="na">entityId</span><span class="o">(<</span><span class="n">USER_ID</span><span class="o">>);</span> |
| <span class="n">client</span><span class="o">.</span><span class="na">createEvent</span><span class="o">(</span><span class="n">userEvent</span><span class="o">);</span> |
| </pre></td> </tr></tbody></table> </div> </div> </div> <p>When a new item "i0" is created in your app on time <code>2014-11-02T09:39:45.618-08:00</code> (current time will be used if eventTime is not specified), you can send a <code>$set</code> event for the item. Note that the item is set with categories properties: <code>"c1"</code> and <code>"c2"</code>. Run the following <code>curl</code> command:</p><div class="tabs"> <ul class="control"> <li data-lang="json"><a href="#tab-65f3c0d1-d22e-42aa-8a84-d8aca0e92daf">REST API</a></li> <li data-lang="python"><a href="#tab-7ab42a34-494f-4041-ad1f-05813a1aad0c">Python SDK</a></li> <li data-lang="php"><a href="#tab-5d45b7e8-939d-470b-a7ce-a56bd5ebc3fb">PHP SDK</a></li> <li data-lang="ruby"><a href="#tab-f55d3cb6-a088-4c80-93eb-0d3e308cad37">Ruby SDK</a></li> <li data-lang="java"><a href="#tab-74927bdc-5224-40fc-b45d-1bcd189ba8bb">Java SDK</a></li> </ul> <div data-tab="REST API" data-lang="json" id="tab-65f3c0d1-d22e-42aa-8a84-d8aca0e92daf"> <div class="highlight shell"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11</pre></td> <td class="code"><pre><span class="gp">$ </span>curl -i -X POST http://localhost:7070/events.json?accessKey<span class="o">=</span><span class="nv">$ACCESS_KEY</span> <span class="se">\</span> |
| -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span> |
| -d <span class="s1">'{ |
| "event" : "$set", |
| "entityType" : "item" |
| "entityId" : "i0", |
| "properties" : { |
| "categories" : ["c1", "c2"] |
| } |
| "eventTime" : "2014-11-02T09:39:45.618-08:00" |
| }'</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Python SDK" data-lang="python" id="tab-7ab42a34-494f-4041-ad1f-05813a1aad0c"> <div class="highlight python"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10</pre></td> <td class="code"><pre><span class="c"># Create a new item or set existing item's categories</span> |
| |
| <span class="n">client</span><span class="o">.</span><span class="n">create_event</span><span class="p">(</span> |
| <span class="n">event</span><span class="o">=</span><span class="s">"$set"</span><span class="p">,</span> |
| <span class="n">entity_type</span><span class="o">=</span><span class="s">"item"</span><span class="p">,</span> |
| <span class="n">entity_id</span><span class="o">=</span><span class="n">item_id</span><span class="p">,</span> |
| <span class="n">properties</span><span class="o">=</span><span class="p">{</span> |
| <span class="s">"categories"</span> <span class="p">:</span> <span class="p">[</span><span class="s">"<CATEGORY_1>"</span><span class="p">,</span> <span class="s">"<CATEGORY_2>"</span><span class="p">]</span> |
| <span class="p">}</span> |
| <span class="p">)</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="PHP SDK" data-lang="php" id="tab-5d45b7e8-939d-470b-a7ce-a56bd5ebc3fb"> <div class="highlight php"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9</pre></td> <td class="code"><pre><span class="cp"><?php</span> |
| <span class="c1">// Create a new item or set existing item's categories |
| </span><span class="nv">$client</span><span class="o">-></span><span class="na">createEvent</span><span class="p">(</span><span class="k">array</span><span class="p">(</span> |
| <span class="s1">'event'</span> <span class="o">=></span> <span class="s1">'$set'</span><span class="p">,</span> |
| <span class="s1">'entityType'</span> <span class="o">=></span> <span class="s1">'item'</span><span class="p">,</span> |
| <span class="s1">'entityId'</span> <span class="o">=></span> <span class="o"><</span><span class="nx">ITEM</span> <span class="nx">ID</span><span class="o">></span> |
| <span class="s1">'properties'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span><span class="s1">'categories'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span><span class="s1">'<CATEGORY_1>'</span><span class="p">,</span> <span class="s1">'<CATEGORY_2>'</span><span class="p">))</span> |
| <span class="p">));</span> |
| <span class="cp">?></span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Ruby SDK" data-lang="ruby" id="tab-f55d3cb6-a088-4c80-93eb-0d3e308cad37"> <div class="highlight ruby"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9</pre></td> <td class="code"><pre><span class="c1"># Create a new item or set existing item's categories</span> |
| <span class="n">client</span><span class="p">.</span><span class="nf">create_event</span><span class="p">(</span> |
| <span class="s1">'$set'</span><span class="p">,</span> |
| <span class="s1">'item'</span><span class="p">,</span> |
| <span class="o"><</span><span class="no">ITEM</span> <span class="no">ID</span><span class="o">></span><span class="p">,</span> <span class="p">{</span> |
| <span class="s1">'properties'</span> <span class="o">=></span> <span class="p">{</span> <span class="s1">'categories'</span> <span class="o">=></span> <span class="p">[</span><span class="s1">'<CATEGORY_1>'</span><span class="p">,</span> <span class="s1">'<CATEGORY_2>'</span><span class="p">]</span> <span class="p">}</span> |
| <span class="p">}</span> |
| <span class="p">)</span> |
| |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Java SDK" data-lang="java" id="tab-74927bdc-5224-40fc-b45d-1bcd189ba8bb"> <div class="highlight java"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7</pre></td> <td class="code"><pre><span class="c1">// Create a new item or set existing item's categories</span> |
| <span class="n">Event</span> <span class="n">itemEvent</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Event</span><span class="o">()</span> |
| <span class="o">.</span><span class="na">event</span><span class="o">(</span><span class="s">"$set"</span><span class="o">)</span> |
| <span class="o">.</span><span class="na">entityType</span><span class="o">(</span><span class="s">"item"</span><span class="o">)</span> |
| <span class="o">.</span><span class="na">entityId</span><span class="o">(<</span><span class="n">ITEM_ID</span><span class="o">>)</span> |
| <span class="o">.</span><span class="na">property</span><span class="o">(</span><span class="s">"categories"</span><span class="o">,</span> <span class="n">ImmutableList</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="s">"<CATEGORY_1>"</span><span class="o">,</span> <span class="s">"<CATEGORY_2>"</span><span class="o">));</span> |
| <span class="n">client</span><span class="o">.</span><span class="na">createEvent</span><span class="o">(</span><span class="n">itemEvent</span><span class="o">)</span> |
| </pre></td> </tr></tbody></table> </div> </div> </div> <p>The properties of the <code>user</code> and <code>item</code> can be set, unset, or delete by special events <strong>$set</strong>, <strong>$unset</strong> and <strong>$delete</strong>. Please refer to <a href="/datacollection/eventapi/#note-about-properties">Event API</a> for more details of using these events.</p><p>When the user "u0" view item "i0" on time <code>2014-11-10T12:34:56.123-08:00</code> (current time will be used if eventTime is not specified), you can send a view event. Run the following <code>curl</code> command:</p><div class="tabs"> <ul class="control"> <li data-lang="json"><a href="#tab-59e7237f-5378-4a2b-b3e8-8246a20634fe">REST API</a></li> <li data-lang="python"><a href="#tab-d95d6042-4b13-404c-8344-c458f14b0f48">Python SDK</a></li> <li data-lang="php"><a href="#tab-52317aa0-a78d-4aa2-9b04-5d6c5cb5e029">PHP SDK</a></li> <li data-lang="ruby"><a href="#tab-38773d32-49c7-4c21-8e5c-dbaea2efa2d7">Ruby SDK</a></li> <li data-lang="java"><a href="#tab-148642b7-a0dd-4188-9e19-eff43c693070">Java SDK</a></li> </ul> <div data-tab="REST API" data-lang="json" id="tab-59e7237f-5378-4a2b-b3e8-8246a20634fe"> <div class="highlight shell"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10</pre></td> <td class="code"><pre><span class="gp">$ </span>curl -i -X POST http://localhost:7070/events.json?accessKey<span class="o">=</span><span class="nv">$ACCESS_KEY</span> <span class="se">\</span> |
| -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span> |
| -d <span class="s1">'{ |
| "event" : "view", |
| "entityType" : "user" |
| "entityId" : "u0", |
| "targetEntityType" : "item", |
| "targetEntityId" : "i0", |
| "eventTime" : "2014-11-10T12:34:56.123-08:00" |
| }'</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Python SDK" data-lang="python" id="tab-d95d6042-4b13-404c-8344-c458f14b0f48"> <div class="highlight python"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9</pre></td> <td class="code"><pre><span class="c"># A user views an item</span> |
| |
| <span class="n">client</span><span class="o">.</span><span class="n">create_event</span><span class="p">(</span> |
| <span class="n">event</span><span class="o">=</span><span class="s">"view"</span><span class="p">,</span> |
| <span class="n">entity_type</span><span class="o">=</span><span class="s">"user"</span><span class="p">,</span> |
| <span class="n">entity_id</span><span class="o">=<</span><span class="n">USER</span> <span class="n">ID</span><span class="o">></span><span class="p">,</span> |
| <span class="n">target_entity_type</span><span class="o">=</span><span class="s">"item"</span><span class="p">,</span> |
| <span class="n">target_entity_id</span><span class="o">=<</span><span class="n">ITEM</span> <span class="n">ID</span><span class="o">></span> |
| <span class="p">)</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="PHP SDK" data-lang="php" id="tab-52317aa0-a78d-4aa2-9b04-5d6c5cb5e029"> <div class="highlight php"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10</pre></td> <td class="code"><pre><span class="cp"><?php</span> |
| <span class="c1">// A user views an item |
| </span><span class="nv">$client</span><span class="o">-></span><span class="na">createEvent</span><span class="p">(</span><span class="k">array</span><span class="p">(</span> |
| <span class="s1">'event'</span> <span class="o">=></span> <span class="s1">'view'</span><span class="p">,</span> |
| <span class="s1">'entityType'</span> <span class="o">=></span> <span class="s1">'user'</span><span class="p">,</span> |
| <span class="s1">'entityId'</span> <span class="o">=></span> <span class="o"><</span><span class="nx">USER</span> <span class="nx">ID</span><span class="o">></span><span class="p">,</span> |
| <span class="s1">'targetEntityType'</span> <span class="o">=></span> <span class="s1">'item'</span><span class="p">,</span> |
| <span class="s1">'targetEntityId'</span> <span class="o">=></span> <span class="o"><</span><span class="nx">ITEM</span> <span class="nx">ID</span><span class="o">></span> |
| <span class="p">));</span> |
| <span class="cp">?></span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Ruby SDK" data-lang="ruby" id="tab-38773d32-49c7-4c21-8e5c-dbaea2efa2d7"> <div class="highlight ruby"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10</pre></td> <td class="code"><pre><span class="c1"># A user views an item.</span> |
| <span class="n">client</span><span class="p">.</span><span class="nf">create_event</span><span class="p">(</span> |
| <span class="s1">'view'</span><span class="p">,</span> |
| <span class="s1">'user'</span><span class="p">,</span> |
| <span class="o"><</span><span class="no">USER</span> <span class="no">ID</span><span class="o">></span><span class="p">,</span> <span class="p">{</span> |
| <span class="s1">'targetEntityType'</span> <span class="o">=></span> <span class="s1">'item'</span><span class="p">,</span> |
| <span class="s1">'targetEntityId'</span> <span class="o">=></span> <span class="o"><</span><span class="no">ITEM</span> <span class="no">ID</span><span class="o">></span> |
| <span class="p">}</span> |
| <span class="p">)</span> |
| |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Java SDK" data-lang="java" id="tab-148642b7-a0dd-4188-9e19-eff43c693070"> <div class="highlight java"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8</pre></td> <td class="code"><pre><span class="c1">// A user views an item</span> |
| <span class="n">Event</span> <span class="n">viewEvent</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Event</span><span class="o">()</span> |
| <span class="o">.</span><span class="na">event</span><span class="o">(</span><span class="s">"view"</span><span class="o">)</span> |
| <span class="o">.</span><span class="na">entityType</span><span class="o">(</span><span class="s">"user"</span><span class="o">)</span> |
| <span class="o">.</span><span class="na">entityId</span><span class="o">(<</span><span class="n">USER_ID</span><span class="o">>)</span> |
| <span class="o">.</span><span class="na">targetEntityType</span><span class="o">(</span><span class="s">"item"</span><span class="o">)</span> |
| <span class="o">.</span><span class="na">targetEntityId</span><span class="o">(<</span><span class="n">ITEM_ID</span><span class="o">>);</span> |
| <span class="n">client</span><span class="o">.</span><span class="na">createEvent</span><span class="o">(</span><span class="n">viewEvent</span><span class="o">);</span> |
| </pre></td> </tr></tbody></table> </div> </div> </div> <p>When the user "u0" buy item "i0" on time <code>2014-11-10T13:00:00.123-08:00</code> (current time will be used if eventTime is not specified), you can send a view event. Run the following <code>curl</code> command:</p><div class="tabs"> <ul class="control"> <li data-lang="json"><a href="#tab-1eb2e45f-93c0-4e1e-a3a3-0e7808d7ef76">REST API</a></li> <li data-lang="python"><a href="#tab-87a3dbb9-ed0f-448e-a265-d106e85228b8">Python SDK</a></li> <li data-lang="php"><a href="#tab-b592b5ef-9b1c-423b-9157-e11c91c1a225">PHP SDK</a></li> <li data-lang="ruby"><a href="#tab-6cde83c4-1d83-4c13-bfac-79c63fb96986">Ruby SDK</a></li> <li data-lang="java"><a href="#tab-9988a4e2-21e7-4221-9b1c-268da247e958">Java SDK</a></li> </ul> <div data-tab="REST API" data-lang="json" id="tab-1eb2e45f-93c0-4e1e-a3a3-0e7808d7ef76"> <div class="highlight shell"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10</pre></td> <td class="code"><pre><span class="gp">$ </span>curl -i -X POST http://localhost:7070/events.json?accessKey<span class="o">=</span><span class="nv">$ACCESS_KEY</span> <span class="se">\</span> |
| -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span> |
| -d <span class="s1">'{ |
| "event" : "buy", |
| "entityType" : "user" |
| "entityId" : "u0", |
| "targetEntityType" : "item", |
| "targetEntityId" : "i0", |
| "eventTime" : "2014-11-10T13:00:00.123-08:00" |
| }'</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Python SDK" data-lang="python" id="tab-87a3dbb9-ed0f-448e-a265-d106e85228b8"> <div class="highlight python"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9</pre></td> <td class="code"><pre><span class="c"># A user buys an item</span> |
| |
| <span class="n">client</span><span class="o">.</span><span class="n">create_event</span><span class="p">(</span> |
| <span class="n">event</span><span class="o">=</span><span class="s">"buy"</span><span class="p">,</span> |
| <span class="n">entity_type</span><span class="o">=</span><span class="s">"user"</span><span class="p">,</span> |
| <span class="n">entity_id</span><span class="o">=<</span><span class="n">USER</span> <span class="n">ID</span><span class="o">></span><span class="p">,</span> |
| <span class="n">target_entity_type</span><span class="o">=</span><span class="s">"item"</span><span class="p">,</span> |
| <span class="n">target_entity_id</span><span class="o">=<</span><span class="n">ITEM</span> <span class="n">ID</span><span class="o">></span> |
| <span class="p">)</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="PHP SDK" data-lang="php" id="tab-b592b5ef-9b1c-423b-9157-e11c91c1a225"> <div class="highlight php"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10</pre></td> <td class="code"><pre><span class="cp"><?php</span> |
| <span class="c1">// A user buys an item |
| </span><span class="nv">$client</span><span class="o">-></span><span class="na">createEvent</span><span class="p">(</span><span class="k">array</span><span class="p">(</span> |
| <span class="s1">'event'</span> <span class="o">=></span> <span class="s1">'buy'</span><span class="p">,</span> |
| <span class="s1">'entityType'</span> <span class="o">=></span> <span class="s1">'user'</span><span class="p">,</span> |
| <span class="s1">'entityId'</span> <span class="o">=></span> <span class="o"><</span><span class="nx">USER</span> <span class="nx">ID</span><span class="o">></span><span class="p">,</span> |
| <span class="s1">'targetEntityType'</span> <span class="o">=></span> <span class="s1">'item'</span><span class="p">,</span> |
| <span class="s1">'targetEntityId'</span> <span class="o">=></span> <span class="o"><</span><span class="nx">ITEM</span> <span class="nx">ID</span><span class="o">></span> |
| <span class="p">));</span> |
| <span class="cp">?></span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Ruby SDK" data-lang="ruby" id="tab-6cde83c4-1d83-4c13-bfac-79c63fb96986"> <div class="highlight ruby"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9</pre></td> <td class="code"><pre><span class="c1"># A user buys an item.</span> |
| <span class="n">client</span><span class="p">.</span><span class="nf">create_event</span><span class="p">(</span> |
| <span class="s1">'buy'</span><span class="p">,</span> |
| <span class="s1">'user'</span><span class="p">,</span> |
| <span class="o"><</span><span class="no">USER</span> <span class="no">ID</span><span class="o">></span><span class="p">,</span> <span class="p">{</span> |
| <span class="s1">'targetEntityType'</span> <span class="o">=></span> <span class="s1">'item'</span><span class="p">,</span> |
| <span class="s1">'targetEntityId'</span> <span class="o">=></span> <span class="o"><</span><span class="no">ITEM</span> <span class="no">ID</span><span class="o">></span> |
| <span class="p">}</span> |
| <span class="p">)</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Java SDK" data-lang="java" id="tab-9988a4e2-21e7-4221-9b1c-268da247e958"> <div class="highlight java"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8</pre></td> <td class="code"><pre><span class="c1">// A user buys an item</span> |
| <span class="n">Event</span> <span class="n">viewEvent</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Event</span><span class="o">()</span> |
| <span class="o">.</span><span class="na">event</span><span class="o">(</span><span class="s">"buy"</span><span class="o">)</span> |
| <span class="o">.</span><span class="na">entityType</span><span class="o">(</span><span class="s">"user"</span><span class="o">)</span> |
| <span class="o">.</span><span class="na">entityId</span><span class="o">(<</span><span class="n">USER_ID</span><span class="o">>)</span> |
| <span class="o">.</span><span class="na">targetEntityType</span><span class="o">(</span><span class="s">"item"</span><span class="o">)</span> |
| <span class="o">.</span><span class="na">targetEntityId</span><span class="o">(<</span><span class="n">ITEM_ID</span><span class="o">>);</span> |
| <span class="n">client</span><span class="o">.</span><span class="na">createEvent</span><span class="o">(</span><span class="n">viewEvent</span><span class="o">);</span> |
| </pre></td> </tr></tbody></table> </div> </div> </div> <p><h3 id='query-event-server' class='header-anchors'>Query Event Server</h3><p>Now let's query the EventServer and see if these events are imported successfully.</p><p>Go to following URL with your browser:</p><p><code><a href="http://localhost:7070/events.json?accessKey=&lt;YOUR_ACCESS_KEY">http://localhost:7070/events.json?accessKey=&lt;YOUR_ACCESS_KEY</a>></code></p><p>or run the following command in terminal:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ </span>curl -i -X GET <span class="s2">"<a href="http://localhost:7070/events.json?accessKey=">http://localhost:7070/events.json?accessKey=</a></span><span class="nv">$ACCESS_KEY</span><span class="s2">"</span> |
| </pre></td></tr></tbody></table> </div> <div class="alert-message note"><p>Note that you should quote the entire URL by using single or double quotes when you run the <code>curl</code> command.</p></div><p>It should return the imported events in JSON format. You can refer to <a href="/datacollection/eventapi/#debugging-recipes">Event Server Debugging Recipes</a> for more different ways to query Event Server.</p></p><h3 id='import-more-sample-data' class='header-anchors'>Import More Sample Data</h3><p>This engine requires more data in order to train a useful model. Instead of sending more events one by one in real time, for quickstart demonstration purpose, we are going to use a script to import more events in batch.</p> <p>A Python import script <code>import_eventserver.py</code> is provided to import sample data. It imports 10 users (with user ID "u1" to "u10") and 50 items (with item ID "i1" to "i50") with some random assigned categories ( with categories "c1" to "c6"). Each user then randomly view 10 items.</p><p>First, you will need to install Python SDK in order to run the sample data import script. To install Python SDK, run:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ </span>pip install predictionio |
| </pre></td></tr></tbody></table> </div> <p>or</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ </span>easy_install predictionio |
| </pre></td></tr></tbody></table> </div> <div class="alert-message note"><p>You may need <code>sudo</code> access if you have permission issue. (ie. <code>sudo pip install predictionio</code>)</p></div> <p><a href="#"></a></p> <p>Make sure you are under the <code>MyECommerceRecommendation</code> directory. Execute the following to import the data (Replace the value of access_key parameter with your <strong>Access Key</strong>):</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2</pre></td><td class="code"><pre><span class="gp">$ </span><span class="nb">cd </span>MyECommerceRecommendation |
| <span class="gp">$ </span>python data/import_eventserver.py --access_key 3mZWDzci2D5YsqAnqNnXH9SB6Rg3dsTBs8iHkK6X2i54IQsIZI1eEeQQyMfs7b3F |
| </pre></td></tr></tbody></table> </div> <p>You should see the following output:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9</pre></td><td class="code"><pre>... |
| User u10 buys item i14 |
| User u10 views item i46 |
| User u10 buys item i46 |
| User u10 views item i30 |
| User u10 buys item i30 |
| User u10 views item i40 |
| User u10 buys item i40 |
| 204 events are imported. |
| </pre></td></tr></tbody></table> </div> <p><a href="#"></a></p><div class="alert-message warning"><p>If you see error <strong>TypeError: <strong>init</strong>() got an unexpected keyword argument 'access_key'</strong>, please update the Python SDK to the latest version.</p></div><p>You can query the event server again as described previously to check the imported events.</p> <h2 id='5.-deploy-the-engine-as-a-service' class='header-anchors'>5. Deploy the Engine as a Service</h2><p>Now you can build, train, and deploy the engine. First, make sure you are under the <code>MyECommerceRecommendation</code> directory.</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ </span><span class="nb">cd </span>MyECommerceRecommendation |
| </pre></td></tr></tbody></table> </div> <h3 id='engine.json' class='header-anchors'>Engine.json</h3><p>Under the directory, you should find an <code>engine.json</code> file; this is where you specify parameters for the engine.</p><div class="alert-message warning"><p>Modify this file to make sure the <code>appName</code> parameter match your <strong>App Name</strong> you created earlier (e.g. "MyApp1" if you follow the quickstart).</p></div><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7</pre></td><td class="code"><pre> ... |
| <span class="s2">"datasource"</span>: <span class="o">{</span> |
| <span class="s2">"params"</span> : <span class="o">{</span> |
| <span class="s2">"appName"</span>: <span class="s2">"MyApp1"</span> |
| <span class="o">}</span> |
| <span class="o">}</span>, |
| ... |
| </pre></td></tr></tbody></table> </div> <div class="alert-message note"><p>You may see <code>appId</code> in engine.json instead, which means you are using old template. In this case, make sure the <code>appId</code> defined in the file match your <strong>App ID</strong>. Alternatively, you can download the latest version of the template or follow our <a href="/resources/upgrade/#upgrade-to-0.9.2">upgrade instructions</a> to modify the template to use <code>appName</code> as parameter.</p></div> <p><a href="#"></a></p> <div class="alert-message warning"><p>Note that the "algorithms" also has <code>appName</code> parameter which you need to modify to match your <strong>App Name</strong> as well:</p></div><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11</pre></td><td class="code"><pre> ... |
| <span class="s2">"algorithms"</span>: <span class="o">[</span> |
| <span class="o">{</span> |
| <span class="s2">"name"</span>: <span class="s2">"als"</span>, |
| <span class="s2">"params"</span>: <span class="o">{</span> |
| <span class="s2">"appName"</span>: <span class="s2">"MyApp1"</span>, |
| ... |
| <span class="o">}</span> |
| <span class="o">}</span> |
| <span class="o">]</span> |
| ... |
| </pre></td></tr></tbody></table> </div> <div class="alert-message note"><p>You may see <code>appId</code> in engine.json instead, which means you are using old template. In this case, make sure the <code>appId</code> defined in the file match your <strong>App ID</strong>. Alternatively, you can download the latest version of the template or follow our <a href="/resources/upgrade/#upgrade-to-0.9.2">upgrade instructions</a> to modify the template to use <code>appName</code> as parameter.</p></div><p><h3 id='building' class='header-anchors'>Building</h3><p>Start with building your <em>MyECommerceRecommendation</em> engine. Run the following command:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ </span>pio build --verbose |
| </pre></td></tr></tbody></table> </div> <p>This command should take few minutes for the first time; all subsequent builds should be less than a minute. You can also run it without <code>--verbose</code> if you don't want to see all the log messages.</p><p>Upon successful build, you should see a console message similar to the following.</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="o">[</span>INFO] <span class="o">[</span>Console<span class="nv">$]</span> Your engine is ready <span class="k">for </span>training. |
| </pre></td></tr></tbody></table> </div> <h3 id='training-the-predictive-model' class='header-anchors'>Training the Predictive Model</h3><p>To train your engine, run the following command:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ </span>pio train |
| </pre></td></tr></tbody></table> </div> <p>When your engine is trained successfully, you should see a console message similar to the following.</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="o">[</span>INFO] <span class="o">[</span>CoreWorkflow<span class="nv">$]</span> Training completed successfully. |
| </pre></td></tr></tbody></table> </div> <h3 id='deploying-the-engine' class='header-anchors'>Deploying the Engine</h3><p>Now your engine is ready to deploy. Run:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ </span>pio deploy |
| </pre></td></tr></tbody></table> </div> <p>When the engine is deployed successfully and running, you should see a console message similar to the following:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2</pre></td><td class="code"><pre><span class="o">[</span>INFO] <span class="o">[</span>HttpListener] Bound to /0.0.0.0:8000 |
| <span class="o">[</span>INFO] <span class="o">[</span>MasterActor] Bind successful. Ready to serve. |
| </pre></td></tr></tbody></table> </div> <p>Do not kill the deployed engine process.</p><p>By default, the deployed engine binds to <a href="http://localhost:8000"><a href="http://localhost:8000">http://localhost:8000</a></a>. You can visit that page in your web browser to check its status.</p><p><img alt="Engine Status" src="/images/engine-server-3246414b.png"/></p></p><h2 id='6.-use-the-engine' class='header-anchors'>6. Use the Engine</h2><p>Now, You can retrieve predicted results. To recommend 4 items to user ID "u1". You send this JSON <code>{ "user": ["u1"], "num": 4 }</code> to the deployed engine and it will return a JSON of the recommended items. Simply send a query by making a HTTP request or through the <code>EngineClient</code> of an SDK.</p><p>With the deployed engine running, open another temrinal and run the following <code>curl</code> command or use SDK to send the query:</p><div class="tabs"> <ul class="control"> <li data-lang="json"><a href="#tab-93d6dda2-02d8-4440-be24-856a403a0bb2">REST API</a></li> <li data-lang="python"><a href="#tab-0fc395b9-1a30-44de-9cf7-f3058a9aef4f">Python SDK</a></li> <li data-lang="php"><a href="#tab-32cecd21-b70c-462b-96e4-4c8083c48297">PHP SDK</a></li> <li data-lang="ruby"><a href="#tab-8de0e0ea-b119-4e65-95d3-524a801efbb0">Ruby SDK</a></li> <li data-lang="java"><a href="#tab-1bdd3a49-8e48-4278-8c07-6edc1d6f5761">Java SDK</a></li> </ul> <div data-tab="REST API" data-lang="json" id="tab-93d6dda2-02d8-4440-be24-856a403a0bb2"> <div class="highlight shell"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4</pre></td> <td class="code"><pre><span class="gp">$ </span>curl -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span> |
| -d <span class="s1">'{ "user": "u1", "num": 4 }'</span> <span class="se">\</span> |
| http://localhost:8000/queries.json |
| |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Python SDK" data-lang="python" id="tab-0fc395b9-1a30-44de-9cf7-f3058a9aef4f"> <div class="highlight python"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3</pre></td> <td class="code"><pre><span class="kn">import</span> <span class="nn">predictionio</span> |
| <span class="n">engine_client</span> <span class="o">=</span> <span class="n">predictionio</span><span class="o">.</span><span class="n">EngineClient</span><span class="p">(</span><span class="n">url</span><span class="o">=</span><span class="s">"http://localhost:8000"</span><span class="p">)</span> |
| <span class="k">print</span> <span class="n">engine_client</span><span class="o">.</span><span class="n">send_query</span><span class="p">({</span><span class="s">"user"</span><span class="p">:</span> <span class="s">"u1"</span><span class="p">,</span> <span class="s">"num"</span><span class="p">:</span> <span class="mi">4</span><span class="p">})</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="PHP SDK" data-lang="php" id="tab-32cecd21-b70c-462b-96e4-4c8083c48297"> <div class="highlight php"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10</pre></td> <td class="code"><pre><span class="cp"><?php</span> |
| <span class="k">require_once</span><span class="p">(</span><span class="s2">"vendor/autoload.php"</span><span class="p">);</span> |
| <span class="k">use</span> <span class="nx">predictionio\EngineClient</span><span class="p">;</span> |
| |
| <span class="nv">$client</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">EngineClient</span><span class="p">(</span><span class="s1">'http://localhost:8000'</span><span class="p">);</span> |
| |
| <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-></span><span class="na">sendQuery</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="s1">'user'</span><span class="o">=></span> <span class="s1">'i1'</span><span class="p">,</span> <span class="s1">'num'</span><span class="o">=></span> <span class="mi">4</span><span class="p">));</span> |
| <span class="nb">print_r</span><span class="p">(</span><span class="nv">$response</span><span class="p">);</span> |
| |
| <span class="cp">?></span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Ruby SDK" data-lang="ruby" id="tab-8de0e0ea-b119-4e65-95d3-524a801efbb0"> <div class="highlight ruby"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7</pre></td> <td class="code"><pre><span class="c1"># Create client object.</span> |
| <span class="n">client</span> <span class="o">=</span> <span class="no">PredictionIO</span><span class="o">::</span><span class="no">EngineClient</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="s1">'http://localhost:8000'</span><span class="p">)</span> |
| |
| <span class="c1"># Query PredictionIO.</span> |
| <span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="nf">send_query</span><span class="p">(</span><span class="s1">'user'</span> <span class="o">=></span> <span class="s1">'i1'</span><span class="p">,</span> <span class="s1">'num'</span> <span class="o">=></span> <span class="mi">4</span><span class="p">)</span> |
| |
| <span class="nb">puts</span> <span class="n">response</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Java SDK" data-lang="java" id="tab-1bdd3a49-8e48-4278-8c07-6edc1d6f5761"> <div class="highlight java"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15</pre></td> <td class="code"><pre><span class="kn">import</span> <span class="nn">com.google.common.collect.ImmutableMap</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">com.google.common.collect.ImmutableList</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">com.google.gson.JsonObject</span><span class="o">;</span> |
| |
| <span class="kn">import</span> <span class="nn">io.prediction.EngineClient</span><span class="o">;</span> |
| |
| <span class="c1">// create client object</span> |
| <span class="n">EngineClient</span> <span class="n">engineClient</span> <span class="o">=</span> <span class="k">new</span> <span class="n">EngineClient</span><span class="o">(</span><span class="s">"http://localhost:8000"</span><span class="o">);</span> |
| |
| <span class="c1">// query</span> |
| |
| <span class="n">JsonObject</span> <span class="n">response</span> <span class="o">=</span> <span class="n">engineClient</span><span class="o">.</span><span class="na">sendQuery</span><span class="o">(</span><span class="n">ImmutableMap</span><span class="o">.<</span><span class="n">String</span><span class="o">,</span> <span class="n">Object</span><span class="o">></span><span class="n">of</span><span class="o">(</span> |
| <span class="s">"user"</span><span class="o">,</span> <span class="s">"u1"</span><span class="o">,</span> |
| <span class="s">"num"</span><span class="o">,</span> <span class="mi">4</span> |
| <span class="o">));</span> |
| </pre></td> </tr></tbody></table> </div> </div> </div> <p>The following is sample JSON response:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8</pre></td><td class="code"><pre><span class="o">{</span> |
| <span class="s2">"itemScores"</span>:[ |
| <span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i4"</span>,<span class="s2">"score"</span>:0.006009267718658978<span class="o">}</span>, |
| <span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i33"</span>,<span class="s2">"score"</span>:0.005999267822052033<span class="o">}</span>, |
| <span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i14"</span>,<span class="s2">"score"</span>:0.005261309429391667<span class="o">}</span>, |
| <span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i3"</span>,<span class="s2">"score"</span>:0.003007015026561692<span class="o">}</span> |
| <span class="o">]</span> |
| <span class="o">}</span> |
| </pre></td></tr></tbody></table> </div> <p><em>MyECommerceRecommendation</em> is now running.</p><div class="alert-message info"><p>To update the model periodically with new data, simply set up a cron job to call <code>pio train</code> and <code>pio deploy</code>. The engine will continue to serve prediction results during the re-train process. After the training is completed, <code>pio deploy</code> will automatically shutdown the existing engine server and bring up a new process on the same port.</p></div><div class="alert-message info"><p><strong>Note that if you import a <em>large</em> data set</strong> and the training seems to be taking forever or getting stuck, it's likely that there is not enough executor memory. It's recommended to setup a Spark standalone cluster, you'll need to specify more driver and executor memory when training with a large data set. Please see <a href="/resources/faq/#engine-training">FAQ here</a> for instructions.</p></div> <h2 id='setting-constraint-"unavailableitems"' class='header-anchors'>Setting constraint "unavailableItems"</h2><p>Now let's send a item contraint "unavailableItems" (replace accessKey with your Access Key):</p><div class="alert-message note"><p>You can also use SDK to send this event as decribed in the SDK sample above.</p></div><div class="tabs"> <ul class="control"> <li data-lang="json"><a href="#tab-72e00956-94b3-4576-bba5-a41969a69164">REST API</a></li> <li data-lang="python"><a href="#tab-664f8665-86a3-4e38-be2e-fba771b90fd3">Python SDK</a></li> <li data-lang="php"><a href="#tab-0283697c-2c7f-4da3-8e10-b29fceb3e6da">PHP SDK</a></li> <li data-lang="ruby"><a href="#tab-a85f7c04-f0fc-4e50-accf-c527f682965a">Ruby SDK</a></li> <li data-lang="java"><a href="#tab-e42ed2e5-430d-472a-9a18-6e4d1f904f82">Java SDK</a></li> </ul> <div data-tab="REST API" data-lang="json" id="tab-72e00956-94b3-4576-bba5-a41969a69164"> <div class="highlight shell"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11</pre></td> <td class="code"><pre><span class="gp">$ </span>curl -i -X POST http://localhost:7070/events.json?accessKey<span class="o">=</span><span class="nv">$ACCESS_KEY</span> <span class="se">\</span> |
| -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span> |
| -d <span class="s1">'{ |
| "event" : "$set", |
| "entityType" : "constraint" |
| "entityId" : "unavailableItems", |
| "properties" : { |
| "items": ["i4", "i14", "i11"], |
| } |
| "eventTime" : "2015-02-17T02:11:21.934Z" |
| }'</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Python SDK" data-lang="python" id="tab-664f8665-86a3-4e38-be2e-fba771b90fd3"> <div class="highlight python"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10</pre></td> <td class="code"><pre><span class="c"># Set a list of unavailable items</span> |
| |
| <span class="n">client</span><span class="o">.</span><span class="n">create_event</span><span class="p">(</span> |
| <span class="n">event</span><span class="o">=</span><span class="s">"$set"</span><span class="p">,</span> |
| <span class="n">entity_type</span><span class="o">=</span><span class="s">"constraint"</span><span class="p">,</span> |
| <span class="n">entity_id</span><span class="o">=</span><span class="s">"unavailableItems"</span><span class="p">,</span> |
| <span class="n">properties</span><span class="o">=</span><span class="p">{</span> |
| <span class="s">"items"</span> <span class="p">:</span> <span class="p">[</span><span class="s">"<ITEM ID1>"</span><span class="p">,</span> <span class="s">"<ITEM ID2>"</span><span class="p">]</span> |
| <span class="p">}</span> |
| <span class="p">)</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="PHP SDK" data-lang="php" id="tab-0283697c-2c7f-4da3-8e10-b29fceb3e6da"> <div class="highlight php"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9</pre></td> <td class="code"><pre><span class="cp"><?php</span> |
| <span class="c1">// Set a list of unavailable items |
| </span><span class="nv">$client</span><span class="o">-></span><span class="na">createEvent</span><span class="p">(</span><span class="k">array</span><span class="p">(</span> |
| <span class="s1">'event'</span> <span class="o">=></span> <span class="s1">'$set'</span><span class="p">,</span> |
| <span class="s1">'entityType'</span> <span class="o">=></span> <span class="s1">'constraint'</span><span class="p">,</span> |
| <span class="s1">'entityId'</span> <span class="o">=></span> <span class="s1">'unavailableItems'</span><span class="p">,</span> |
| <span class="s1">'properties'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span><span class="s1">'items'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span><span class="s1">'<ITEM ID1>'</span><span class="p">,</span> <span class="s1">'<ITEM ID2>'</span><span class="p">))</span> |
| <span class="p">));</span> |
| <span class="cp">?></span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Ruby SDK" data-lang="ruby" id="tab-a85f7c04-f0fc-4e50-accf-c527f682965a"> <div class="highlight ruby"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8</pre></td> <td class="code"><pre><span class="c1"># Set a list of unavailable items</span> |
| <span class="n">client</span><span class="p">.</span><span class="nf">create_event</span><span class="p">(</span> |
| <span class="s1">'$set'</span><span class="p">,</span> |
| <span class="s1">'constraint'</span><span class="p">,</span> |
| <span class="s1">'unavailableItems'</span><span class="p">,</span> <span class="p">{</span> |
| <span class="s1">'properties'</span> <span class="o">=></span> <span class="p">{</span> <span class="s1">'items'</span> <span class="o">=></span> <span class="p">[</span><span class="s1">'<ITEM ID1>'</span><span class="p">,</span> <span class="s1">'<ITEM ID2>'</span><span class="p">]</span> <span class="p">}</span> |
| <span class="p">}</span> |
| <span class="p">)</span> |
| </pre></td> </tr></tbody></table> </div> </div> <div data-tab="Java SDK" data-lang="java" id="tab-e42ed2e5-430d-472a-9a18-6e4d1f904f82"> <div class="highlight java"> <table style="border-spacing: 0"><tbody><tr> <td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7</pre></td> <td class="code"><pre><span class="c1">// Set a list of unavailable items</span> |
| <span class="n">Event</span> <span class="n">itemEvent</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Event</span><span class="o">()</span> |
| <span class="o">.</span><span class="na">event</span><span class="o">(</span><span class="s">"$set"</span><span class="o">)</span> |
| <span class="o">.</span><span class="na">entityType</span><span class="o">(</span><span class="s">"constraint"</span><span class="o">)</span> |
| <span class="o">.</span><span class="na">entityId</span><span class="o">(</span><span class="s">"unavailableItems"</span><span class="o">)</span> |
| <span class="o">.</span><span class="na">property</span><span class="o">(</span><span class="s">"items"</span><span class="o">,</span> <span class="n">ImmutableList</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="s">"<ITEM ID1>"</span><span class="o">,</span> <span class="s">"<ITEM ID2>"</span><span class="o">));</span> |
| <span class="n">client</span><span class="o">.</span><span class="na">createEvent</span><span class="o">(</span><span class="n">itemEvent</span><span class="o">)</span> |
| </pre></td> </tr></tbody></table> </div> </div> </div> <p>Try to get recommendation for user <em>u1</em> again, the unavaiable items (e.g. i4, i14, i11). won't be recommended anymore:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9</pre></td><td class="code"><pre><span class="gp">$ </span>curl -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span> |
| -d <span class="s1">'{ |
| "user": "u1", |
| "num": 4, |
| "blackList": ["i21", "i26", "i40"] |
| }'</span> <span class="se">\</span> |
| http://localhost:8000/queries.json |
| |
| <span class="o">{</span><span class="s2">"itemScores"</span>:[<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i33"</span>,<span class="s2">"score"</span>:0.005999267822052019<span class="o">}</span>,<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i3"</span>,<span class="s2">"score"</span>:0.0030070150265619003<span class="o">}</span>,<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i2"</span>,<span class="s2">"score"</span>:0.0028489173099429527<span class="o">}</span>,<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i5"</span>,<span class="s2">"score"</span>:0.0028489173099429527<span class="o">}]}</span> |
| </pre></td></tr></tbody></table> </div> <div class="alert-message info"><p>You should send a full list of unavailable items whenever there is any updates in the list. The latest event is used.</p></div><p>When there is no more unavilable items, simply set an empty list. ie.</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11</pre></td><td class="code"><pre><span class="gp">$ </span>curl -i -X POST http://localhost:7070/events.json?accessKey<span class="o">=</span>zPkr6sBwQoBwBjVHK2hsF9u26L38ARSe19QzkdYentuomCtYSuH0vXP5fq7advo4 <span class="se">\</span> |
| -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span> |
| -d <span class="s1">'{ |
| "event" : "$set", |
| "entityType" : "constraint" |
| "entityId" : "unavailableItems", |
| "properties" : { |
| "items": [], |
| } |
| "eventTime" : "2015-02-18T02:11:21.934Z" |
| }'</span> |
| </pre></td></tr></tbody></table> </div> <h2 id='advanced-query' class='header-anchors'>Advanced Query</h2><p>In addition, the Query support the following optional parameters <code>categories</code>, <code>whiteList</code> and <code>blackList</code>.</p><h3 id='recommend-items-in-selected-categories:' class='header-anchors'>Recommend items in selected categories:</h3><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9</pre></td><td class="code"><pre><span class="gp">$ </span>curl -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span> |
| -d <span class="s1">'{ |
| "user": "u1", |
| "num": 4, |
| "categories" : ["c4", "c3"] |
| }'</span> <span class="se">\</span> |
| http://localhost:8000/queries.json |
| |
| <span class="o">{</span><span class="s2">"itemScores"</span>:[<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i4"</span>,<span class="s2">"score"</span>:0.006009267718658978<span class="o">}</span>,<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i33"</span>,<span class="s2">"score"</span>:0.005999267822052033<span class="o">}</span>,<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i14"</span>,<span class="s2">"score"</span>:0.005261309429391667<span class="o">}</span>,<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i2"</span>,<span class="s2">"score"</span>:0.002848917309942939<span class="o">}]}</span> |
| </pre></td></tr></tbody></table> </div> <h3 id='recommend-items-in-the-whitelist:' class='header-anchors'>Recommend items in the whiteList:</h3><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9</pre></td><td class="code"><pre><span class="gp">$ </span>curl -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span> |
| -d <span class="s1">'{ |
| "user": "u1", |
| "num": 4, |
| "whiteList": ["i1", "i2", "i3", "i21", "i22", "i23", "i24", "i25"] |
| }'</span> <span class="se">\</span> |
| http://localhost:8000/queries.json |
| |
| <span class="o">{</span><span class="s2">"itemScores"</span>:[<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i3"</span>,<span class="s2">"score"</span>:0.003007015026561692<span class="o">}</span>,<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i2"</span>,<span class="s2">"score"</span>:0.002848917309942939<span class="o">}</span>,<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i23"</span>,<span class="s2">"score"</span>:0.0016857619403278443<span class="o">}</span>,<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i25"</span>,<span class="s2">"score"</span>:1.3707548965227745E-4<span class="o">}]}</span> |
| </pre></td></tr></tbody></table> </div> <h3 id='recommend-items-not-in-the-blacklist:' class='header-anchors'>Recommend items not in the blackList:</h3><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10</pre></td><td class="code"><pre><span class="gp">$ </span>curl -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span> |
| -d <span class="s1">'{ |
| "user": "u1", |
| "num": 4, |
| "categories" : ["c4", "c3"], |
| "blackList": ["i21", "i26", "i40"] |
| }'</span> <span class="se">\</span> |
| http://localhost:8000/queries.json |
| |
| <span class="o">{</span><span class="s2">"itemScores"</span>:[<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i4"</span>,<span class="s2">"score"</span>:0.006009267718658978<span class="o">}</span>,<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i33"</span>,<span class="s2">"score"</span>:0.005999267822052033<span class="o">}</span>,<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i14"</span>,<span class="s2">"score"</span>:0.005261309429391667<span class="o">}</span>,<span class="o">{</span><span class="s2">"item"</span>:<span class="s2">"i2"</span>,<span class="s2">"score"</span>:0.002848917309942939<span class="o">}]}</span> |
| </pre></td></tr></tbody></table> </div> <h4 id='<a-href="/templates/ecommercerecommendation/dase/">next:-dase-components-explained</a>' class='header-anchors' ><a href="/templates/ecommercerecommendation/dase/">Next: DASE Components Explained</a></h4></div></div></div></div><footer><div class="container"><div class="seperator"></div><div class="row"><div class="col-md-6 col-xs-6 footer-link-column"><div class="footer-link-column-row"><h4>Community</h4><ul><li><a href="//docs.prediction.io/install/" target="blank">Download</a></li><li><a href="//docs.prediction.io/" target="blank">Docs</a></li><li><a href="//github.com/apache/incubator-predictionio" target="blank">GitHub</a></li><li><a href="mailto:user-subscribe@predictionio.incubator.apache.org" target="blank">Subscribe to User Mailing List</a></li><li><a href="//stackoverflow.com/questions/tagged/predictionio" target="blank">Stackoverflow</a></li></ul></div></div><div class="col-md-6 col-xs-6 footer-link-column"><div class="footer-link-column-row"><h4>Contribute</h4><ul><li><a href="//predictionio.incubator.apache.org/community/contribute-code/" target="blank">Contribute</a></li><li><a href="//github.com/apache/incubator-predictionio" target="blank">Source Code</a></li><li><a href="//issues.apache.org/jira/browse/PIO" target="blank">Bug Tracker</a></li><li><a href="mailto:dev-subscribe@predictionio.incubator.apache.org" target="blank">Subscribe to Development Mailing List</a></li></ul></div></div></div></div><div id="footer-bottom"><div class="container"><div class="row"><div class="col-md-12"><div id="footer-logo-wrapper"><img alt="PredictionIO" src="/images/logos/logo-white-d1e9c6e6.png"/></div><div id="social-icons-wrapper"><a class="github-button" href="https://github.com/apache/incubator-predictionio" data-style="mega" data-count-href="/apache/incubator-predictionio/stargazers" data-count-api="/repos/apache/incubator-predictionio#stargazers_count" data-count-aria-label="# stargazers on GitHub" aria-label="Star apache/incubator-predictionio on GitHub">Star</a> <a class="github-button" href="https://github.com/apache/incubator-predictionio/fork" data-icon="octicon-git-branch" data-style="mega" data-count-href="/apache/incubator-predictionio/network" data-count-api="/repos/apache/incubator-predictionio#forks_count" data-count-aria-label="# forks on GitHub" aria-label="Fork apache/incubator-predictionio on GitHub">Fork</a> <script id="github-bjs" async="" defer="" src="https://buttons.github.io/buttons.js"></script><a href="//www.facebook.com/predictionio" target="blank"><img alt="PredictionIO on Twitter" src="/images/icons/twitter-ea9dc152.png"/></a> <a href="//twitter.com/predictionio" target="blank"><img alt="PredictionIO on Facebook" src="/images/icons/facebook-5c57939c.png"/></a> </div></div></div></div></div></footer></div><script>(function(w,d,t,u,n,s,e){w['SwiftypeObject']=n;w[n]=w[n]||function(){ |
| (w[n].q=w[n].q||[]).push(arguments);};s=d.createElement(t); |
| e=d.getElementsByTagName(t)[0];s.async=1;s.src=u;e.parentNode.insertBefore(s,e); |
| })(window,document,'script','//s.swiftypecdn.com/install/v1/st.js','_st'); |
| |
| _st('install','HaUfpXXV87xoB_zzCQ45');</script><script src="/javascripts/application-5a24945b.js"></script></body></html> |