ClickPackageIndex
|
Size: 9095
Comment:
|
Size: 11462
Comment:
|
| Deletions are marked like this. | Additions are marked like this. |
| Line 26: | Line 26: |
| || string || solr.StrField || Untokenized text. || || boolean || solr.BoolField || True or False. || || float || solr.TrieFloatField || Floating point number. || || long || solr.TrieLongField || Long integer. || || date || solr.TrieDateField || Date of the format 'YYYY-MM-DD"T"hh24:mm:ss[.nnn]"Z"', e.g. '2013-06-27T12:39:45.776Z' || || url || solr.StrField || Untokenized text. || || text_general || solr.TextField || Tokenized text. Reasonable cross-language defaults. StandardTokenizer, case-insensitive stop words, and down-casing. Query-time synonyms. || || text_en || solr.TextField || English-language tokenized text. StandardTokenizer, case-insensitive stop words, down-casing, protected words and minimal stemming. Query-time synonyms.|| || key_value || solr.TextField || Key-value pair, i.e. 'key|value'. || |
|| string || {{{solr.StrField}}} || Untokenized text. || || boolean || {{{solr.BoolField}}} || True or False. || || float || {{{solr.TrieFloatField}}} || Floating point number. || || long || {{{solr.TrieLongField}}} || Long integer. || || date || {{{solr.TrieDateField}}} || Date of the format {{{'YYYY-MM-DD"T"hh24:mm:ss[.nnn]"Z"'}}}, e.g. {{{'2013-06-27T12:39:45.776Z'}}} || || url || {{{solr.StrField}}} || Untokenized text. || || text_general || {{{solr.TextField}}} || Tokenized text. Reasonable cross-language defaults. {{{StandardTokenizer}}}, case-insensitive stop words, and down-casing. Query-time synonyms. || || text_en || {{{solr.TextField}}} || English-language tokenized text. {{{StandardTokenizer}}}, case-insensitive stop words, down-casing, protected words and minimal stemming. Query-time synonyms.|| || key_value || {{{solr.TextField}}} || Key-value pair, i.e. {{{'key|value'}}}. || |
| Line 66: | Line 66: |
| == Localisation == Fields marked as translatable will have localised variants whose field name is suffixed with one of the following country codes: || '''Suffix''' || '''Language''' || || ar || Arabic || || bg || Bulgarian || || ca || Catalan || || cn || Chinese || || cz || Czech || || da || Danish || || de || German || || el || Greek || || en || English || || es || Spanish || || eu || Basque || || fa || Persian || || fi || Finnish || || fr || French || || ga || Irish || || gl || Galician || || hi || Hindi || || hu || Hungarian || || hy || Armenian || || id || Indonesian || || it || Italian || || ja || Japanese || || kr || Korean || || lv || Latvian || || nl || Dutch || || no || Norwegian || || pt || Portuguese || || ro || Romanian || || ru || Russian || || sv || Swedish || || th || Thai || || tr || Turkish || For queries: * If the query specifies a localisation (e.g. {{{q=description_en:foo}}}), we should use it. * Similarly, if a specific localised result field is requested (e.g. {{{fl=description_en}}}), we should use it. * In the general case, clients should use the non-localised field name in queries ({{{q=description}}}) and result fields ({{{fl=description}}}) and provide an {{{Accept-Language}}} header, which we will use to choose the localised variant. * If the request specifies an alternative localisation ({{{lang=en}}}) we should use that in preference to the language in the {{{Accept-Language}}} header. This keeps the query API flexible, but avoids unnecessary complexity in the client for the general case. We'll need to be wary of caching, in particular - {{{Vary: Accept-Language}}} and {{{ETag}}} headers will be required at least. |
|
| Line 97: | Line 144: |
| Proxies requests to Solr's SearchHandler. A subset of the standard Solr syntax is used for querying. | Proxies requests to Solr's {{{SearchHandler}}}. A subset of the standard Solr syntax is used for querying. |
Contents
Click Package Index
Contact: James Tait (JamesTait)
- Solr-backed repository for Click Application metadata
- Public front-end will serve as access control, apply sane defaults and massage request and response for ease of use.
- Interfaces with:
- Software Centre Agent
- App developer defines app in Software Centre website
- App developer uploads packaged app
- Software Centre Agent pushes metadata to Click Package Index
- First iteration, metadata is entered by developer
- Later to be harvested from Click Manifest
- Dash
- "Surfacing", i.e. first view of app lens before querying
- "Search", i.e. list of apps that match search criteria
- "Detail", i.e. full metadata for a given app
- Software Centre Agent
Solr Schema
Field Types
Name |
Class |
Notes |
string |
solr.StrField |
Untokenized text. |
boolean |
solr.BoolField |
True or False. |
float |
solr.TrieFloatField |
Floating point number. |
long |
solr.TrieLongField |
Long integer. |
date |
solr.TrieDateField |
Date of the format 'YYYY-MM-DD"T"hh24:mm:ss[.nnn]"Z"', e.g. '2013-06-27T12:39:45.776Z' |
url |
solr.StrField |
Untokenized text. |
text_general |
solr.TextField |
Tokenized text. Reasonable cross-language defaults. StandardTokenizer, case-insensitive stop words, and down-casing. Query-time synonyms. |
text_en |
solr.TextField |
English-language tokenized text. StandardTokenizer, case-insensitive stop words, down-casing, protected words and minimal stemming. Query-time synonyms. |
key_value |
solr.TextField |
Key-value pair, i.e. 'key|value'. |
Fields
Name |
Type |
Multi-value |
Searchable |
Retrievable |
Required |
Unique |
Translatable |
id |
string |
false |
true |
true |
true |
true |
false |
title |
text_en |
false |
true |
true |
true |
false |
true |
description |
text_en |
false |
true |
true |
true |
false |
true |
price |
float |
false |
true |
true |
false |
false |
true (currencies) |
package_name |
text_general |
false |
true |
true |
true |
true |
false |
binary_filesize |
long |
false |
false |
true |
false |
false |
false |
icon_url |
url |
false |
false |
true |
false |
false |
false |
icon_urls |
payloads |
true |
true |
true |
false |
false |
false |
screenshot_url |
url |
false |
false |
true |
false |
false |
false |
screenshot_urls |
url |
true |
false |
true |
false |
false |
false |
terms_of_service |
text_en |
false |
false |
true |
false |
false |
true |
support_url |
url |
false |
false |
true |
false |
false |
true |
license |
text_general |
false |
true |
true |
true |
false |
false |
date_published |
date |
false |
true |
true |
false |
false |
false |
video_urls |
url |
true |
false |
true |
false |
false |
false |
license_key_path |
string |
false |
false |
true |
false |
false |
false |
requires_license_key |
boolean |
false |
true |
true |
false |
false |
false |
version |
string |
false |
true |
true |
true |
false |
false |
website |
url |
false |
false |
true |
false |
false |
true |
company_name |
text_general |
false |
true |
true |
false |
false |
false |
keywords |
text_en |
true |
true |
true |
false |
false |
true |
click_version |
string |
false |
true |
true |
true |
false |
false |
click_framework |
string |
true |
true |
true |
true |
false |
false |
click_updown_url |
url |
false |
false |
true |
true |
false |
false |
countries_to_distribute |
string |
true |
true |
false |
false |
false |
false |
text |
text_en |
true |
true |
false |
false |
false |
true |
Localisation
Fields marked as translatable will have localised variants whose field name is suffixed with one of the following country codes:
Suffix |
Language |
ar |
Arabic |
bg |
Bulgarian |
ca |
Catalan |
cn |
Chinese |
cz |
Czech |
da |
Danish |
de |
German |
el |
Greek |
en |
English |
es |
Spanish |
eu |
Basque |
fa |
Persian |
fi |
Finnish |
fr |
French |
ga |
Irish |
gl |
Galician |
hi |
Hindi |
hu |
Hungarian |
hy |
Armenian |
id |
Indonesian |
it |
Italian |
ja |
Japanese |
kr |
Korean |
lv |
Latvian |
nl |
Dutch |
no |
Norwegian |
pt |
Portuguese |
ro |
Romanian |
ru |
Russian |
sv |
Swedish |
th |
Thai |
tr |
Turkish |
For queries:
If the query specifies a localisation (e.g. q=description_en:foo), we should use it.
Similarly, if a specific localised result field is requested (e.g. fl=description_en), we should use it.
In the general case, clients should use the non-localised field name in queries (q=description) and result fields (fl=description) and provide an Accept-Language header, which we will use to choose the localised variant.
If the request specifies an alternative localisation (lang=en) we should use that in preference to the language in the Accept-Language header.
This keeps the query API flexible, but avoids unnecessary complexity in the client for the general case. We'll need to be wary of caching, in particular - Vary: Accept-Language and ETag headers will be required at least.
API
Guiding principles:
- JSON-based
- Discoverable
- Browseable
API Root
/api/v1
Provides clickable links to the other endpoints for discoverability.
Request
GET /api/v1 HTTP/1.1 Host: search.apps.ubuntu.com
Response
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
{
"search": "http://search.apps.ubuntu.com/api/v1/search",
"package": "http://search.apps.ubuntu.com/api/v1/package"
}
Search
/api/v1/search
Proxies requests to Solr's SearchHandler. A subset of the standard Solr syntax is used for querying.
Request
GET /api/v1/search?q=click_framework:ubuntu-sdk-13.10,description:awesome&wt=json&fl=id,title,description,price,icon_url HTTP/1.1 Host: search.apps.ubuntu.com
Response
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
{
"responseHeader":{
"status":0,
"QTime":1,
"params":{
"fl": "id,title,description,price,icon_url",
"indent":"on",
"start":"0",
"q":"click_framework:ubuntu-sdk-13.10,description:awesome",
"wt":"json",
"version":"2.2",
"rows":"10"
}
},
"response":{
"numFound":2,
"start":0,
"docs":[
{
"id": "1",
"title": "Awesome Launcher",
"description": "This is an awesome launcher.",
"price": 1.99,
"icon_url": "http://example.org/media/awesomelauncher/icons/icon16.png",
"resource_url": "http://search.apps.ubuntu.com/api/v1/package/1"
},
{
"id": "2",
"title": "Awesome Widget",
"description": "This is an awesome widget.",
"price": 1.99,
"icon_url": "http://example.org/media/awesomewidget/icons/icon16.png",
"resource_url": "http://search.apps.ubuntu.com/api/v1/package/2"
}
]
}
}
Details
/api/v1/package
Requests details for a specific package. Cleans the query string to ensure the user cannot be tricked into installing the wrong package, and enforces a single item in the response.
Request
GET /api/v1/package/2?wt=json&fl=id,title,description,price,icon_url HTTP/1.1 Host: search.apps.ubuntu.com
Response
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
{
"responseHeader":{
"status":0,
"QTime":1,
"params":{
"fl": "id,title,description,price,icon_url",
"indent":"on",
"start":"0",
"q":"id:2",
"wt":"json",
"version":"2.2",
"rows":"1"
}
},
"response":{
"numFound":1,
"start":0,
"docs":[
{
"id": "2",
"title": "Awesome Widget",
"description": "This is an awesome widget.",
"price": 1.99,
"icon_url": "http://example.org/media/awesomewidget/icons/icon16.png",
}
]
}
}AppStore/Interfaces/ClickPackageIndex (last edited 2018-04-01 09:09:46 by popey)