3

「NEW YORK」、「new york」、「new-york」、「ny」など、値を取得している(つまり、ランダムにフォーマットされた)都市名フィールドがあります。

そのフィールドの値を取得したら、名前にその値が含まれる都市のリストを次の形式でユーザーに提示する必要があります:
NY – ニューヨーク市 – 10001
MN – ニューヨーク ミルズ – 56567

効率とパフォーマンスが重要です。このデータを取得するには、JavaScript または PHP を使用できます。

これまで、Freebase API を使用してみました。私が使用したクエリの例を次に示します: http://tinyurl.com/3ogpf7k

そして、これが私が使用しているJavaScriptコードです:

// App.q contains city name field's value

var query = {
    extended : 1,
    query : [{
        search : App.q,
        type : '/location/citytown',
        id : null,
        name : null,
        postal_codes : [],
        "/location/location/containedby" : [{
            "type" : "/location/us_state",
            "name": null,
            // two letters abbreviation of state
            "/common/topic/alias" : []
        }]
    }]
},
url = 'http://www.freebase.com/api/service/mqlread?callback=?&query=' + 
      encodeURIComponent(JSON.stringify(query));

$.getJSON(url, function( data ) {
    var cities, i, len, name, aliases, j, abbr, postal_code, HTML = [];

    for ( i = 0, len = data.result.length; i < len; i += 1 ) {
        // cities with names matching user's input
        if ( data.result[ i ].name.toLowerCase().indexOf( App.q ) === -1 ) continue;
        // cities that have postal_codes data available
        if ( data.result[ i ].postal_codes.length === 0 ) continue;

        name = data.result[ i ].name;
        aliases = data.result[ i ]["/location/location/containedby"][0]["/common/topic/alias"];
        postal_code = data.result[ i ].postal_codes[0];

        // find two-letters alias
        for ( j = aliases.length - 1; j >= 0; j -= 1 ) {
            if ( aliases[j].length === 2 && aliases[j] === aliases[j].toUpperCase() ) {
                 abbr = aliases[j];
            }
        }

        HTML.push( D.renderHTML( liTemplate, {
            name : name,
            abbr : abbr,
            postal_code : postal_code
        }) );

    }

    console.log( HTML.join('') );
});

ただし、「ニューヨーク」をクエリしても「ニューヨーク市」すら返されないようです。

私のニーズを満たすより良い API はありますか? Freebase API に何か問題がありますか?

アップデート。同じようなことを可能にするもう 1 つの便利な API (ただし、それでも私のニーズをカットするものではありません。結果が多すぎて、それらをページングする方法がありません):
Docs: http://www.geonames.org/export/web- services.html
例: http://api.geonames.org/postalCodeSearch?placename=los%20angeles&username=demo&maxRows=500

ありがとう!

4

1 に答える 1

1

前回の誤解を招く回答で申し訳ありません。「名前」プロパティではなく、MQL 拡張機能の「検索」を使用していることに気付きませんでした。

主な問題は、デフォルトの順序付けが検索スコアによるものではないことです (理由はわかりませんが、そのようになっています)。このようにクエリを変更すると、問題が解決するはずです。

"search":       {"query":"New York","score":null,"type_strict":"all"},
"sort":"-search.score",
"type":"/location/citytown",

sort パラメータは、「検索」サブクエリから返された「スコア」値によって降順でソートされます。また、検索に mql_filter パラメーターを使用して、制約を満たさないものを考慮しないようにすることもできます (わずかに効率的です)。

検索拡張機能はここに文書化されており、使用されている基礎となる検索サービスの文書はここにあります

于 2011-06-14T21:36:41.430 に答える