দক্ষতার সাথে নিকটস্থ 20 টি পয়েন্ট কীভাবে খুঁজে পাবেন [বন্ধ]


9

বলুন আমি আমার নিকটতম 20 টি ব্যবসা খুঁজে পেতে চাই।

My table structure is like this:

    BusinessID  varchar(250)    utf8_unicode_ci         No  None        Browse distinct values  Change  Drop    Primary     Unique  Index   Fulltext
    Prominent   double          No  None        Browse distinct values  Change  Drop    Primary     Unique  Index   Fulltext
    LatLong     point           No  None        Browse distinct values  Change  Drop    Primary     Unique  Index   Fulltext
    FullTextSearch  varchar(600)    utf8_bin        No  None        Browse distinct values  Change  Drop    Primary     Unique  Index   Fulltext
With selected: Check All / Uncheck All With selected:
Print viewPrint view Propose table structurePropose table structureDocumentation
Add new fieldAdd field(s) At End of Table At Beginning of Table After
Indexes: Documentation
Action  Keyname Type    Unique  Packed  Field   Cardinality Collation   Null    Comment
Edit    Drop    PRIMARY BTREE   Yes No  BusinessID  1611454 A       
Edit    Drop    Prominent   BTREE   No  No  Prominent   0   A       
Edit    Drop    LatLong BTREE   No  No  LatLong (25)    0   A       
Edit    Drop    sx_mytable_coords   SPATIAL No  No  LatLong (32)    0   A       
Edit    Drop    FullTextSearch  FULLTEXT    No  No  FullTextSearch  0           

এখানে 1.6 মিলিয়ন বিজ রয়েছে। অবশ্যই এটি সবার জন্য দূরত্ব গণনা করা এবং তারপরে এটি বাছাই করা বোকামি।

ভূ-স্থানিক সূচকটি ঠিক সেখানে লাথি দেয়?

সুতরাং আমি কি এসকিউএল কমমান কাস্ট করা প্রয়োজন?

বিঃদ্রঃ:

  1. আমি মাইএসকিএল মাইসাম স্পেসিয়াল ইনডেক্স ব্যবহার করছি । তবে আমি এর আগে এটি নির্দিষ্ট করেছিলাম না। সুতরাং যারা আমার প্রশংসা দেখানোর জন্য এবং অন্য প্রশ্ন জিজ্ঞাসা করার জন্য এর উত্তর দিয়েছেন তাদের আমি গ্রহণ করব।
  2. আমি পুরো টেবিলের জন্য দূরত্ব গণনা করতে চাই না
  3. আমি এখনও কোনও অযোগ্য অঞ্চলের জন্য দূরত্ব গণনা করতে চাই না
  4. আমি যুক্তিসঙ্গত সংখ্যার জন্য দূরত্ব গণনা করতে চাই কারণ আমি পয়েন্টগুলি দূরত্ব অনুসারে বাছাই করতে চাই এবং পয়েন্ট 1-20, 21-40, 41-60, ইত্যাদি প্রদর্শন করতে সক্ষম হব

3
ক্রস পোস্ট ডিবিএস্ট্যাকেক্সেঞ্জিং / প্রশ্নগুলি / ১৯৫৯ / ((প্রতিটি উত্তর পোস্টজিআইএসকে সম্বোধন করছে এমন প্রশ্ন করতেও খারাপ জুজু মনে হয়)
ইভান ক্যারল

উত্তর:


7

স্থানীয় প্রশ্নগুলি অবশ্যই ব্যবহারের জিনিস।

পোস্টজিআইএস দিয়ে আমি প্রথমে এর মতো সরল কিছু চেষ্টা করবো এবং প্রয়োজনীয়তা অনুসারে পরিসরটি টুইঙ্ক করবো:

SELECT * 
FROM table AS a
WHERE ST_DWithin (mylocation, a.LatLong, 10000) -- 10km
ORDER BY ST_Distance (mylocation, a.LatLong)
LIMIT 20

এটি স্থানিক সূচক ব্যবহার করে পয়েন্টগুলি (আসলে তাদের সীমানা বাক্সগুলি) তুলনা করবে, তাই এটি দ্রুত হওয়া উচিত। মনে রাখা অন্য একটি পদ্ধতির নাম হল আপনার অবস্থানটি বাফার করা এবং তারপরে সেই ডেটাটিকে মূল ডেটার সাথে ছেদ করা, যা আরও কার্যকর হতে পারে।


9

আপনি যে সমস্ত সন্ধান করছেন তা যদি নিকটবর্তী বিন্দু অনুসন্ধান হয় (নিকটতম প্রতিবেশী অনুসন্ধানগুলি), তবে আপনি তার জন্য পুরানো ST_DWithin বা ST_Distance + অর্ডার BYs ব্যবহার করতে চান না।

আর না.

এখন পোস্টজিআইএস ২.০ প্রেরণ করা হয়েছে, আপনি নঙ্গিস্ট সূচক সমর্থন (একটি স্থানীয় পোস্টগ্রিজ এসকিউএল বৈশিষ্ট্য) ব্যবহার করা উচিত। এটি দ্রুততার আকারের আদেশ হবে।

এই ব্লগ এন্ট্রি থেকে একটি অংশ যা পোস্টজিআইএস ছাড়াই নিট গিস্টটি কীভাবে ব্যবহার করবেন তা বর্ণনা করে :

$ create table test ( position point );

CREATE TABLE
Table created. Now let’s insert some random points:
$ insert into test (position) select point( random() * 1000, random() * 1000) from generate_series(1,1000000);

INSERT 0 1000000
1 million points should be enough for my example. All of them have both X and Y in range <0, 1000). Now we just need the index:
$ create index q on test using gist ( position );

CREATE INDEX
And we can find some rows close to center of the points cloud:
$ select *, position <-> point(500,500) from test order by position <-> point(500,500) limit 10;

              position               |     ?column?

-------------------------------------+-------------------

 (499.965638387948,499.452529009432) | 0.548548271254899

 (500.473062973469,500.450353138149) |  0.65315122744144

 (500.277776736766,500.743471086025) | 0.793668174518778

 (499.986605718732,500.844359863549) | 0.844466095200968

 (500.858531333506,500.130807515234) | 0.868439207229501

 (500.96702715382,499.853323679417)  | 0.978087654172406

 (500.975443981588,500.170825514942) | 0.990289007195055

 (499.201623722911,499.368405900896) |  1.01799596553335

 (498.899147845805,500.683960970491) |  1.29602394829404

 (498.38217580691,499.178630765527)  |  1.81438764851559

(10 rows)
And how about speed?
$ explain analyze select *, position <-> point(500,500) from test order by position <-> point(500,500) limit 10;

                                                        QUERY PLAN

--------------------------------------------------------------------------------------------------------------------------

 Limit  (cost=0.00..0.77 rows=10 width=16) (actual time=0.164..0.475 rows=10 loops=1)

   ->  Index Scan using q on test  (cost=0.00..76512.60 rows=1000000 width=16) (actual time=0.163..0.473 rows=10 loops=1)

         Order By: ("position" <-> '(500,500)'::point)

 Total runtime: 0.505 ms

(4 rows)

যথেষ্ট আকর্ষণীয়, সূচক ট্র্যাভারসাল বৈশিষ্ট্যগুলি নিকটতার সাথে ফিরিয়ে দেবে, সুতরাং ফলাফলের জন্য বাছাই করার প্রয়োজন নেই (অর্থাত্ আদেশ দিয়ে দিন)!

তবে আপনি যদি পোস্টজিআইএসের পাশাপাশি এটি ব্যবহার করতে চান তবে এখন এটি সত্যিই সহজ। কেবল এই নির্দেশাবলী অনুসরণ করুন

সম্পর্কিত অংশটি হ'ল:

SELECT name, gid
FROM geonames
ORDER BY geom <-> st_setsrid(st_makepoint(-90,40),4326)
LIMIT 10;

তবে আমার কথাটি গ্রহণ করবেন না। সময় আপনি নিজেই :)


এটি একটি ভাল উত্তর হবে। তবে আমি মাইএসকিএল মাইসাম ব্যবহার করছি। আমি এটি যুক্ত করতে ভুলে গেছি
ব্যবহারকারী4951

সুতরাং +1 তবে আমি এটি আমার উত্তর হিসাবে নির্বাচন করতে পারি না। আমার কি আর একটি প্রশ্ন তৈরি করা উচিত?
user4951

@ জিমথিও মাইএসকিউএল এর নিকটতম প্রতিবেশী সূচক নেই, সুতরাং নিকটবর্তী প্রতিবেশী ক্যোয়ারী হওয়ার আগে আপনাকে পোস্টজিআইএস-এর মত পদ্ধতির উপর নির্ভর করতে হবে (ST_Dwithin দ্বারা অর্ডার দ্বারা অর্ডার দ্বারা)। মধ্যযুগে :) স্বাগতম ফিরে
রাগি ইয়াসের Burhum

তাহলে আমি মঙ্গোদব যেতে পারি? আমাকে অনুমান করতে দাও. আপনি যদি 20 নিকটতম পয়েন্টগুলি সন্ধান করার মতো সহজ জিনিসটি না করতে পারেন তবে মাইএসকিএল-তে স্থানিক সূচক থাকার বিষয়টি কী?
user4951

1
উইন্ডো ব্যবহার করে আপনি নিকটতম পয়েন্টটি সন্ধান করতে পারেন। @Lynxlynxlynx দ্বারা বর্ণিত অন্য কোনও স্থানিক ডাটাবেসের ক্ষেত্রেও এটি একই। আপনি উইন্ডোটিকে দুটি দিয়ে গুণ করে বাড়িয়ে রাখতে পারেন। হ্যাঁ, মঙ্গো বা অন্য কোনও ডাটাবেসের ক্ষেত্রেও এটি একই। মুল বক্তব্যটি হ'ল আপনি বেশিরভাগ অন্যান্য বৈশিষ্ট্যগুলি কেটে ফেলেছেন। তদ্ব্যতীত, সকলেই জানেন যে সম্প্রতি অবধি মাইএসকিউএল কখনও স্থানিক কোনও কিছুর গুরুতর প্রতিযোগী ছিল না।
রাগী ইয়াসের বুড়হুম

8

পোস্টগ্রিজ এসকিউএল ৯.১-তে পোস্টজিআইএস ২.০ সহ, আপনি কেএনএন সূচকযুক্ত নিকটতম প্রতিবেশী অপারেটর ব্যবহার করতে পারেন , যেমন:

SELECT *, geom <-> ST_MakePoint(-90, 40) AS distance
FROM table
ORDER BY geom <-> ST_MakePoint(-90, 40)
LIMIT 20 OFFSET 0;

উপরের কয়েকটি মিলিসেকেন্ডের মধ্যে জিজ্ঞাসা করা উচিত।

20 পরবর্তী গুণিতক জন্য, এখানে পরিবর্তন OFFSET 20, OFFSET 40ইত্যাদি ...


আমি জানতে পারি এর অর্থ কী <->? ধন্যবাদ।
উত্তরট্রি

<->এমন একটি অপারেটর যা 2D দূরত্ব ফিরিয়ে দেয়।
মাইক টি

1

মাইএসকিউএল স্থানিক

এখানের প্রত্যেকে আপনাকে কীভাবে সুবিধা দিতে হবে তা না জানিয়ে কেএনএন ব্যবহার করে পোস্টগ্রিসএসকিউএল দিয়ে কীভাবে করবেন তা আপনাকে বলছে। মাইএসকিউএল ব্যবহার করে আপনি প্রতিবেশীর সকলের জন্য দূরত্ব গণনা করে নিকটতম প্রতিবেশী নির্ধারণ করতে পারবেন না । এটা অত্যন্ত ধীর। PostgreSQL দিয়ে এটি একটি সূচীতে করা যেতে পারে। মাইএসকিউএল বা মারিয়াডিবি বর্তমানে কেএনএন সমর্থন করে না

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.