This page is a translated version of the page API:Search and discovery and the translation is 100% complete.

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:來尋找相關網頁。

搜尋與居禮夫人(Marie Curie)鐳(radium)有關的頁面。

額外的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);
});