একাধিক কলাম সহ পূর্ণ পাঠ্য অনুসন্ধান পোস্টগ্র্যাগ করে, কেন সূচীতে কনটাক্ট এবং রানটাইমে নয়?


11

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

পোস্টগ্রিস ডকসts_vector কনটেনটেটেড কলামগুলিতে একটি সূচক তৈরি করার বিষয়ে কথা বলে , যেমন:

CREATE INDEX pgweb_idx ON pgweb 
    USING gin(to_tsvector('english', title || ' ' || body));

যা আমি এর মতো অনুসন্ধান করতে পারি:

... WHERE 
      (to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))

যাইহোক, আমি যদি কখনও কখনও কেবল শিরোনামটি অনুসন্ধান করতে চাইতাম, কখনও কখনও কেবল শরীর এবং কখনও কখনও উভয়ই আমার 3 টি পৃথক সূচী প্রয়োজন। এবং আমি যদি কোনও তৃতীয় কলামে যুক্ত করি তবে তা সম্ভবত 6 সূচক এবং আরও কিছু হতে পারে।

একটি বিকল্প যা আমি ডক্সে দেখিনি তা হ'ল দুটি কলামকে আলাদাভাবে সূচীকরণ করা এবং তারপরে কেবল একটি সাধারণ WHERE...ORক্যোয়ারী ব্যবহার করুন :

... WHERE
      (to_tsvector('english', title) @@ to_tsquery('english','foo'))
    OR
      (to_tsvector('english', body) @@ to_tsquery('english','foo'))

দুই মিলিয়ন ডলার সারি বেঞ্চমার্কিংয়ের মূলত পারফরম্যান্সে কোনও পার্থক্য নেই বলে মনে হয়।

সুতরাং আমার প্রশ্নটি হ'ল:

আমি স্বতন্ত্রভাবে কলামগুলি কেবল ইনডেক্সিংয়ের চেয়ে কেন এ জাতীয় সূচিগুলি সংযুক্ত করতে চাই? উভয়ের সুবিধা / অসুবিধাগুলি কী?

আমার সর্বোত্তম অনুমান যে আমি যদি আগে থেকে জানতাম তবে আমি কেবল উভয় কলামই অনুসন্ধান করতে চাই (একবারে কখনই নয়) আমার কেবলমাত্র একটি সূচক প্রয়োজন যা কনটেন্টেট করে কম স্মৃতি ব্যবহার করে।


আমি সত্যিই নির্দিষ্ট কিভাবে concatenating নই titleমধ্যে bodyএবং তারপর ইন্ডেক্স যে কত মূল্য দিতে হবে, যদিও আমি সংশোধন খোলা আছি। আমি সম্ভবত তাদের পৃথক পৃথকভাবে সূচিকর্ম সঙ্গে স্টিক হবে। এছাড়াও, যদি এটি কিছুটা দুশ্চিন্তা ছিল যে কোনওরকমভাবে আপনাকে একত্রিত করার দরকার পড়েছিল, তবে আমি অনুমান করি যে আপনি কেবল অনুসন্ধানটি অ্যাড-হক চালাতে পারেন।
সোয়াসেক পরীক্ষা করুন

আপনি আপনার অনুমান ঠিক আছে। অন্য কেউ না করলে আমি আপনাকে জবাব দিতে উত্সাহিত করব, এখানে বিপদের শৈলী।
jcolebrand

উত্তর:


4

না আপনার আলাদা সূচকের দরকার নেই। ওজন বৈশিষ্ট্যটি ব্যবহার করুন। এগুলি কেবলমাত্র একটি লেবেল যা আপনার বিরুদ্ধে জিজ্ঞাসা করতে পারে। (AD) এর বিরুদ্ধে জিজ্ঞাসা করার জন্য আপনার চারটি পর্যন্ত লেবেল থাকতে পারে।

--search any "field" for quick:
select 'quick:1A brown:2B quick:3C'::tsvector @@ 'quick'::tsquery; --true

--search B "field" for quick:
select 'quick:1A brown:2B quick:3C'::tsvector @@ 'quick:B'::tsquery; --false

--search B or C "fields" for quick:
select 'quick:1A brown:2B quick:3C'::tsvector @@ 'quick:BC'::tsquery; --true

আপনি tsvectors সংযুক্ত করতে চাইতে পারেন, যাতে আপনি পৃথকভাবে তাদের ওজন প্রয়োগ করতে পারেন এবং তারপরে তাদের একসাথে রাখতে পারেন:

select
  setweight( name_column::tsvector, 'A') || setweight( phone_column::tsvector, 'B');

3

আসলে বিকল্প সঙ্গে যেখানে ব্যবহার করতে হবে বা , এবং এবং

আপনার যদি tsvector (বডি + শিরোনাম) এর সূচক থাকে এবং আপনি এটিতে সন্ধান করছেন তবে অনুসন্ধান শব্দগুলি শিরোনামে বা শরীরে থাকতে পারে ।

এছাড়াও - পরীক্ষা করার সময়, টেবিলে আপনার যুক্তিসঙ্গত সংখ্যক সারি রয়েছে তা নিশ্চিত করুন।

সবচেয়ে সহজ ক্ষেত্রে যা ভাল পার্থক্য দেখা উচিত: দুটি শব্দ খুঁজে বার করুন - এর মধ্যে একটি যা শিরোনামে হওয়ার সম্ভাবনা খুব বেশি। এবং অন্যটি - এটি শরীরে থাকার খুব সম্ভবত। তবে নিশ্চিত হয়ে নিন যে উভয় মাপদণ্ডের সাথে মেলে এমন সারি বেশি নেই । উদাহরণস্বরূপ - আপনার কাছে "Depesz" শব্দটি 30% শরীরে থাকতে পারে। আপনার কাছে শিরোনামে "মাইএসকিএল" থাকার 30% ডলার সম্ভাবনাও রয়েছে। তবে একই সারির যে কোনও ক্ষেত্রে "ডিপিজ এবং মাইএসকিএল" থাকা খুব সম্ভব নয়। এবং তারপরে এই জাতীয় সূচকগুলির সাথে পারফরম্যান্স পরীক্ষা করুন।


হা, ভাল স্পট, ওআর ভার্সিতে এবং আমি প্রশ্নটি আপডেট করব। আমি এটি 1 মিলিয়ন সারি দিয়ে করেছি - আর কোনও inোকানোর অপেক্ষা করে বিরক্ত করা যায় না :)
লটেন্টফ্লিপ

1
Depesz দ্বারা বাদ দেওয়ার জন্য ধন্যবাদ - আমরা আজকাল বেশ কয়েকটি পোস্টগ্রাস প্রশ্ন পাচ্ছি তাই আশা করি আপনারা আশেপাশে থাকবেন :-)
জ্যাক বলেছেন টপান্সওয়ার্স.অক্সিজ

@ জ্যাক: নিশ্চিত নই যে আমি যাব - আমি স্ট্যাকএক্সচেঞ্জ সাইটগুলি কম এবং ব্যবহারযোগ্য হিসাবে খুঁজে পেয়েছি। আমি সাধারণত আরএসএস পাওয়ার চেষ্টা করি, তবে স্ট্যাকেক্সচেঞ্জ সাইটগুলিতে আরএসএস অনেকটা অকেজো - পুরানো প্রশ্নের সংস্করণ থেকে এত দূষণ হয়।

আমি এখানে আপনার জন্য একটি আরএসএস ফিড তৈরি করেছি - আপনি কি এটি চেষ্টা করে দেখতে চান? আপনি যাতে সাইটের আরও বেশি জড়িত হওয়ার সুযোগ পাওয়ার ক্ষেত্রে আপনার আগ্রহী হওয়ার সম্ভাবনা কম থাকে সেগুলি ফিল্টার করে দেওয়ার জন্য আমি প্রচেষ্টাটি খুশি
করে দেখছি:

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