API:搜索和探索
本页是MediaWiki Action API帮助文档的一部份。 |
MediaWiki、其擴充功能、以及其姊妹專案,憑藉著搜尋,擁有著發現知識的巨大潛力。 搜尋平台團隊持續維護相關的機制、工具、和服務以達到此目標。
使用者可以透過在MediaWiki中直接查詢找到資訊、也可以透過在維基數據中閱讀Help:浏览维基数据找到資訊。
MediaWiki
MediaWiki API有幾個搜尋相關的模組。
您可以在任何wiki的 /w/api.php
入口點、或在Special:ApiSandbox填入API請求參數,提出請求並查看其所產生的說明。
查詢模組
- action=opensearch
- 請参见API:opensearch 。 以OpenSearch格式回傳搜尋的結果,每個結果都是透過維基媒體專案上的Extension:TextExtracts 。 請查看自動產生的MediaWiki API帮助文件頁面
- action=languagesearch
- 在任何腳本中搜尋語言名稱。 請查看自動產生的MediaWiki API帮助文件頁面
查詢清單子模組
這些查詢子模組會傳回符合搜尋條件的 wiki 頁面清單,有些還會傳回每個頁面的附加資訊。 此外,您可以將每個當作是產生器使用,來提供回傳頁面的集合的許多其他屬性,例如引導圖片、摘錄、和/或頁面描述。
- action=query list=prefixsearch
- 取回具有指定前綴的wiki頁面標題。 請參閱展示文章搜尋結果中的頁面資訊。 請參閱API:前缀搜索 並查看自動產生的API帮助文件的模組文件。
- action=query list=search
- 使用 wiki 搜尋引擎來尋找匹配的頁面。 在維基媒體的wiki上,它提供來自CirrusSearch的搜尋結果,會回傳典型的搜尋結果的資訊,例如文字摘錄和頁面大小。 請參閱API:搜索 並查看自動產生的API帮助文件的模組文件。
- action=query list=geosearch
- 如果wiki上安裝了GeoData擴充功能,則會返回某個地點附近的wiki頁面及其地理資訊。 請參閱展示文章顯示附近的wiki資訊、地理搜尋和查看自動產生的API帮助文件的模組文件。
客户端
命令列
您可以在命令列上使用cURL來查詢API,以提出API請求,然後再使用jq來解析JSON的回應。
舉例來說,讓我們試著查詢在維基數據上的項目Richard Feynman (Q39246)、並請求它的英文標籤:
$ URL='https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q39246&format=json'
$ curl -s $URL | jq '.entities[].labels.en.value'
"Richard Feynman"
$ curl -s $URL | jq '.entities[].claims|length'
55
我們找到,Q39246是維基數據項目的英文標籤為"Richard Feynman"(理查·費曼)的識別碼,並且有55個關於他的聲稱(claim)。
JavaScript
要以JavaScript寫一個MediaWiki API的用戶端程式,只需要一個JSONP處理程式。 許多函式庫 (例如jQuery) 都包含有JSONP用戶端,或是你也可以獨立撰寫一個。
在MediaWiki生態系統中,可以直接使用 jQuery:
$.ajax({
url: '//www.wikidata.org/w/api.php',
data: { action: 'wbgetentities', ids: mw.config.get('wgWikibaseItemId'), format: 'json' },
dataType: 'jsonp',
success: function (x) {
console.log('wb label', x.entities.Q39246.labels.en.value);
console.log('wb description', x.entities.Q39246.descriptions.en.value);
}
});
這使用了jQuery的$.ajax()
,它在許多互動式JavaScript編碼環境中都有提供,如果您的最終目標是一個獨立的單機專案,這就很合理。
如果您的最終目標是在wiki上執行程式碼,例如作為 Gadget,那麼您應該使用由'mediawiki.api'資源加載器模組所提供的更高階的mw.api()
功能。
在其他環境中,一個簡單的JSONP處理程式即可:
var mw;
(function (mw) {
/**
* Query a MediaWiki api.php instance with the given options
*/
function mwQuery(endpoint, options) {
/**
* Create a uniquely-named callback that will process the JSONP results
*/
var createCallback = function (k) {
var i = 1;
var callbackName;
do {
callbackName = 'callback' + i;
i = i + 1;
} while (window[callbackName])
window[callbackName] = k;
return callbackName;
}
/**
* Flatten an object into a URL query string.
* For example: { foo: 'bar', baz: 42 } becomes 'foo=bar&baz=42'
*/
var queryStr = function (options) {
var query = [];
for (var i in options) {
if (options.hasOwnProperty(i)) {
query.push(encodeURIComponent(i) + '=' + encodeURIComponent(options[i]));
}
}
return query.join('&');
}
/**
* Build a function that can be applied to a callback. The callback processes
* the JSON results of the API call.
*/
return function (k) {
options.format = 'json';
options.callback = createCallback(k);
var script = document.createElement('script');
script.src = endpoint + '?' + queryStr(options);
var head = document.getElementsByTagName('head')[0];
head.appendChild(script);
};
}
mw.api = {
query: mwQuery,
};
})(mw || (mw = {}));
CirrusSearch
CirrusSearch是一個MediaWiki的擴充功能,用來啟用以Elasti為基礎、搜尋MediaWiki內容的功能。
它充當搜尋的後端,所以action=query&list=search
是這個功能的主要介面。
您可以在API查詢中使用相同的Cirrus功能,使用者可以在搜尋方塊中輸入這些功能。
例如,您可以使用特殊前綴morelike:
來尋找相關網頁。
額外的CirrusSearch API模組
另外,CirrusSearch可匯報其組態和內部資訊。 這些API可能只有在您已熟悉Elasticsearch並想要瞭解CirrusSearch是如何使用它之時,才有用。 這些都被視為是內部除錯的API,而且變更API的輸出時不保證其向下兼容性。
?action=cirrusdump
頁面參數- 例如,https://en.wikipedia.org/wiki/2014?action=cirrusdump
- 給Special:Search查詢的
?cirrusDumpQuery
參數 - 這是一個index.php的操作参数,例如,https://en.wikipedia.org/wiki/Special:Search/cat%20dog%20chicken?cirrusDumpQuery
- 給Special:Search查詢的
?cirrusDumpResult
參數 - 這是一個index.php的操作参数,例如,https://en.wikipedia.org/wiki/Special:Search/cat%20dog%20chicken?cirrusDumpResult
- 另外一個參數
cirrusExplain
可以與cirrusDumpResult
一起傳送,以便在結果轉儲中包含lucene對分數的解釋(explanation)。 例如 https://en.wikipedia.org/wiki/Special:Search/cat%20dog%20chicken?cirrusDumpResult&cirrusExplain - API模块 cirrus-config-dump, cirrus-settings-dump, cirrus-mapping-dump
- 這些轉存了 CirrusSearch 的設定。 这是一个查詢示例:
维基数据
維基數據的API包含一些操作(wbgetentities, wbgetclaims, wbsearchentities),可用於搜尋關於實體、屬性、陳述、和主張的資訊。
维基数据查询服务
Wikidata Query Service 透過 SPARQL 執行以圖表為基礎的 Wikidata 搜尋。API. 它在https://query.wikidata.org/是可用的
WDQS Explorer (示範) (原始碼) 提供使用 SPARQL 查詢維基數據查詢服務的瀏覽器內圖形探索功能。
交互式示例
维基百科
瀏覽至 https://en.wikipedia.org/wiki/Main_Page,開啟 JavaScript 主控台,並執行下列內容:
$.ajax({
url: '//en.wikipedia.org/w/api.php',
data: {
action: 'query',
list: 'search',
srsearch: 'Richard Feynman',
format: 'json',
formatversion: 2
},
dataType: 'jsonp',
success: function (x) {
console.log('title', x.query.search[0].title);
}
});
這會記錄字串 Richard Feynman
到 JavaScript 控制台。
如果 MediaWiki 函式庫和環境不可用,可以使用上面的 wmQuery()
函式:
var queryWikipedia = mw.api.query('//en.wikipedia.org/w/api.php',
{ action: 'query', list: 'search', srsearch: 'Richard Feynman' });
queryWikipedia(function (x) {
console.log('title', x.query.search[0].title);
});
维基数据
我們可以使用 JSONP,直接從 Web 瀏覽器的 JavaScript 主控台執行上述步驟。
在維基百科上,維基數據的項目標識符可透過 MediaWiki 配置值 wgWikibaseItemId
取得。
瀏覽至 https://en.wikipedia.org/wiki/Richard_Feynman,開啟 JavaScript 主控台,並執行下列內容:
$.ajax({
url: '//www.wikidata.org/w/api.php',
data: { action: 'wbgetentities', ids: mw.config.get('wgWikibaseItemId'), format: 'json' },
dataType: 'jsonp',
success: function (x) {
console.log('wb label', x.entities.Q39246.labels.en.value);
console.log('wb description', x.entities.Q39246.descriptions.en.value);
}
});
這會記錄字串 Richard Feynman
和維基數據項描述字串「美國量子物理學家」到JavaScript控制台。
如果 MediaWiki 函式庫和環境不可用,可以使用上面的 wmQuery()
函式:
var queryWikidata = mw.api.query('//www.wikidata.org/w/api.php',
{ action: 'wbgetentities', ids: 'Q39246' });
queryWikidata(function (x) {
console.log('wb label', x.entities.Q39246.labels.en.value);
console.log('wb description', x.entities.Q39246.descriptions.en.value);
});
维基词典
瀏覽至 https://en.wikipedia.org/wiki/Main_Page,開啟 JavaScript 主控台,並執行下列內容:
$.ajax({
url: '//en.wiktionary.org/w/api.php',
data: { action: 'query', prop: 'revisions', rvprop: 'content', titles: 'Richard Feynman', format: 'json' },
dataType: 'jsonp',
success: function (x) {
console.log('wiktionary title', x.query.pages['-1'].title);
}
});
這會記錄字串 Richard Feynman
到 JavaScript 控制台。
如果 MediaWiki 函式庫和環境不可用,可以使用上面的 wmQuery()
函式:
var queryWiktionary = mw.api.query('//en.wiktionary.org/w/api.php',
{ action: 'query', prop: 'revisions', rvprop: 'content', titles: 'Richard Feynman' });
queryWiktionary(function (x) {
console.log('wiktionary title', x.query.pages['-1'].title);
});