কেন পূর্ণ-পাঠ্য-অনুসন্ধানে লাইকের চেয়ে কম সারি ফিরছে


10

আমি যেমনটি চাই তেমন পূর্ণ-পাঠ্য-অনুসন্ধানে কাজ করি না এবং ফলাফল তালিকাগুলির পার্থক্য আমি বুঝতে পারি না।

উদাহরণ বিবৃতি:

SELECT `meldungstext`
FROM `artikel`
WHERE `meldungstext` LIKE '%punkt%'

92 সারি প্রদান করে। আমি সারিগুলি পেয়েছি যার ম্যাচগুলি রয়েছে, উদাহরণস্বরূপ, কলাম মেলডাংস্টেক্সটে "পাঙ্কটেন", "জুই-পাঙ্কে-ভোরসপং" এবং "ট্রেফপঙ্ক্ট"।

আমি "মেলডংস্টেক্সট" কলামে একটি পূর্ণ পাঠ্য-সূচি সেট করেছি এবং এটি চেষ্টা করেছি:

SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*')

এটি কেবল 8 টি সারি দেয়। আমি কেবল সারি সারি পেয়েছি যা "পাঙ্ক্ট" এর সাথে মেলে বা আমার মনে হয় যে শব্দগুলি "আই-পাঙ্ক্ট" এর মতো "পাঙ্ক্ট" হিসাবে নেওয়া হয়।

আমি তখন বুলিয়ান মোড চেষ্টা করেছিলাম:

SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*' IN BOOLEAN MODE)

44 সারি প্রদান করে। আমি সারিগুলি পেয়েছি যার মধ্যে কলাম মেলডাংস্টেক্সটে "জুই-পাঙ্কে-ভোরসপং" বা "ট্রেফপঙ্ক্ট" রয়েছে তবে "পাঙ্কটেন" নেই those

কেন এটি ঘটে এবং আমি কীভাবে ক্লজটিতে LIKE '%%' ব্যবহার রোধ করতে একটি "সম্পূর্ণ" সম্পূর্ণ পূর্ণ-পাঠ্য-সন্ধানটি সেট করতে পারি?


1
এটি একটি বড় +1 প্রাপ্য, কারণ এই সমস্যাটি সত্যই পরীক্ষা করা হয় না এবং প্রায়শই ফুলটেক্স ইনডেক্সিং মঞ্জুর হয়।
রোল্যান্ডোমাইএসকিউএলডিবিএ

উত্তর:


13

আমি আপনার প্রশ্নের তিনটি স্ট্রিং নিয়েছি এবং এটিকে একটি টেবিলের সাথে আরও তিনটি স্ট্রিংয়ের panktপরিবর্তে যুক্ত করেছি punkt

উইন্ডোজের জন্য মাইএসকিউএল 5.5.12 ব্যবহার করে নিম্নলিখিতটি কার্যকর করা হয়েছিল

mysql> CREATE TABLE artikel
    -> (
    ->     id INT NOT NULL AUTO_INCREMENT,
    ->     meldungstext MEDIUMTEXT,
    ->     PRIMARY KEY (id),
    ->     FULLTEXT (meldungstext)
    -> ) ENGINE=MyISAM;
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO artikel (meldungstext) VALUES
    -> ('Punkten'),('Zwei-Punkte-Vorsprung'),('Treffpunkt'),
    -> ('Pankten'),('Zwei-Pankte-Vorsprung'),('Treffpankt');
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql>

আমি 3 টি ভিন্ন ভিন্ন পদ্ধতির সাহায্যে টেবিলের বিপরীতে এই প্রশ্নগুলি চালিয়েছি

পার্থক্য নোট করুন

mysql> SELECT id,meldungstext,
    -> COUNT(IF(MATCH (`meldungstext`) AGAINST ('*punkt*' IN BOOLEAN MODE),1,0)) PunktMatch,
    -> IF(LOCATE('punkt',meldungstext)>0,1,0) PunktLocate,
    -> meldungstext  LIKE '%punkt%' PunktLike
    -> FROM `artikel` GROUP BY id,meldungstext;
+----+-----------------------+------------+-------------+-----------+
| id | meldungstext          | PunktMatch | PunktLocate | PunktLike |
+----+-----------------------+------------+-------------+-----------+
|  1 | Punkten               |          1 |           1 |         1 |
|  2 | Zwei-Punkte-Vorsprung |          1 |           1 |         1 |
|  3 | Treffpunkt            |          1 |           1 |         1 |
|  4 | Pankten               |          1 |           0 |         0 |
|  5 | Zwei-Pankte-Vorsprung |          1 |           0 |         0 |
|  6 | Treffpankt            |          1 |           0 |         0 |
+----+-----------------------+------------+-------------+-----------+
6 rows in set (0.01 sec)

mysql>

সমস্ত পাঙ্ক ম্যাচ মানগুলি 3 1 এবং 3 0 এর মৌমাছি হওয়া উচিত।

এখন আমাকে সাধারণ হিসাবে জিজ্ঞাসা করুন

mysql> SELECT `meldungstext` FROM `artikel`
    -> WHERE MATCH (`meldungstext`) AGAINST ('*punkt*' IN BOOLEAN MODE);
+-----------------------+
| meldungstext          |
+-----------------------+
| Zwei-Punkte-Vorsprung |
| Punkten               |
+-----------------------+
2 rows in set (0.01 sec)

mysql> SELECT `meldungstext` FROM `artikel`
    -> WHERE LOCATE('punkt',meldungstext)>0;
+-----------------------+
| meldungstext          |
+-----------------------+
| Punkten               |
| Zwei-Punkte-Vorsprung |
| Treffpunkt            |
+-----------------------+
3 rows in set (0.00 sec)

mysql> SELECT `meldungstext` FROM `artikel`
    -> WHERE `meldungstext` LIKE '%punk%';
+-----------------------+
| meldungstext          |
+-----------------------+
| Punkten               |
| Zwei-Punkte-Vorsprung |
| Treffpunkt            |
+-----------------------+
3 rows in set (0.00 sec)

mysql>

ঠিক আছে ম্যাচ ব্যবহার করে .. পাঙ্ক্ট সহ আবার কাজ করে না। পঙ্ক্টের কি ???

mysql> SELECT `meldungstext` FROM `artikel` WHERE `meldungstext` LIKE '%pankt%';
+-----------------------+
| meldungstext          |
+-----------------------+
| Pankten               |
| Zwei-Pankte-Vorsprung |
| Treffpankt            |
+-----------------------+
3 rows in set (0.00 sec)

mysql>

GROUP BYপঙ্ক্টের বিরুদ্ধে আমার বড় প্রশ্নটি চালাও

mysql> SELECT id,meldungstext,
    -> COUNT(IF(MATCH (`meldungstext`) AGAINST ('*pankt*' IN BOOLEAN MODE),1,0)) PanktMatch,
    -> IF(LOCATE('pankt',meldungstext)>0,1,0) PanktLocate,
    -> meldungstext  LIKE '%pankt%' PanktLike
    -> FROM `artikel` GROUP BY id,meldungstext;
+----+-----------------------+------------+-------------+-----------+
| id | meldungstext          | PanktMatch | PanktLocate | PanktLike |
+----+-----------------------+------------+-------------+-----------+
|  1 | Punkten               |          1 |           0 |         0 |
|  2 | Zwei-Punkte-Vorsprung |          1 |           0 |         0 |
|  3 | Treffpunkt            |          1 |           0 |         0 |
|  4 | Pankten               |          1 |           1 |         1 |
|  5 | Zwei-Pankte-Vorsprung |          1 |           1 |         1 |
|  6 | Treffpankt            |          1 |           1 |         1 |
+----+-----------------------+------------+-------------+-----------+
6 rows in set (0.01 sec)

mysql>

এটিও ভুল কারণ পঞ্চম্যাচের জন্য আমার 3 0 এবং 3 1 টি দেখতে হবে।

আমি অন্য কিছু চেষ্টা করেছিলাম

mysql> SELECT id,meldungstext, MATCH (`meldungstext`) AGAINST ('+*pankt*' IN BOOLEAN MODE) PanktMatch, IF(LOCATE('pankt',meldungstext)>0,1,0) PanktLocate, meldungstext  LIKE '%pankt%' PanktLike FROM `artikel` GROUP BY id,meldungstext;
+----+-----------------------+------------+-------------+-----------+
| id | meldungstext          | PanktMatch | PanktLocate | PanktLike |
+----+-----------------------+------------+-------------+-----------+
|  1 | Punkten               |          0 |           0 |         0 |
|  2 | Zwei-Punkte-Vorsprung |          0 |           0 |         0 |
|  3 | Treffpunkt            |          0 |           0 |         0 |
|  4 | Pankten               |          1 |           1 |         1 |
|  5 | Zwei-Pankte-Vorsprung |          1 |           1 |         1 |
|  6 | Treffpankt            |          0 |           1 |         1 |
+----+-----------------------+------------+-------------+-----------+
6 rows in set (0.00 sec)

mysql>

আমি পঙ্কিতে একটি প্লাস চিহ্ন যোগ করেছি এবং আমি বিভিন্ন ফলাফল পেয়েছি। কি 2 এবং 3 নয় ???

মাইএসকিউএল ডকুমেন্টেশন অনুসারে , ওয়াইল্ডকার্ড চরিত্র সম্পর্কে এটি কী বলেছে তা লক্ষ্য করুন:

*

তারকাচিহ্নটি কাটা (বা ওয়াইল্ডকার্ড) অপারেটর হিসাবে কাজ করে। অন্যান্য অপারেটরগুলির বিপরীতে, শব্দটি প্রভাবিত হওয়ার জন্য এটি যুক্ত করা উচিত। শব্দগুলি * অপারেটরের পূর্ববর্তী শব্দটি দিয়ে শুরু করলে শব্দগুলি মিলবে।

যদি কোনও শব্দ ছাঁটাই অপারেটরের সাথে নির্দিষ্ট করা থাকে তবে এটি একটি বুলিয়ান কোয়েরি থেকে ছিটানো হয় না, এমনকি এটি খুব ছোট হলেও (ft_min_word_len সেটিংস থেকে নির্ধারিত) বা স্টপওয়ার্ড। শব্দটি খুব সংক্ষিপ্ত বা স্টপওয়ার্ড হিসাবে দেখা যায় না, তবে এটি একটি উপসর্গ হিসাবে দেখা যায় যা উপসর্গ দিয়ে শুরু হওয়া শব্দের আকারে নথিতে উপস্থিত থাকতে হবে। ধরুন যে ft_min_word_len = 4। তারপরে '+ শব্দ + দ্য *' এর অনুসন্ধানে '+ শব্দ + the' অনুসন্ধানের চেয়ে কম সারি ফিরে আসবে:

পূর্ববর্তী ক্যোয়ারীটি যেমন রয়েছে তেমন এবং দস্তাবেজটিতে উপস্থিত হওয়া শব্দ এবং * (একটি দিয়ে শুরু হওয়া শব্দ) উভয়ই দরকার।

পরের ক্যোয়ারীটি + শব্দে রূপান্তরিত হয়েছে (কেবলমাত্র শব্দের উপস্থিত থাকার প্রয়োজন রয়েছে)। উভয়ই খুব সংক্ষিপ্ত এবং স্টপওয়ার্ড, এবং উভয় শর্তই এটিকে উপেক্ষা করার জন্য যথেষ্ট।

এর উপর ভিত্তি করে, ওয়াইল্ডকার্ড চরিত্রটি টোকেনের পিছনের জন্য প্রযোজ্য, সামনের জন্য নয়। এর আলোকে, আউটপুটটি অবশ্যই সঠিক হতে হবে কারণ 3 পাঙ্ক্টের শুরু টোকেনগুলির মধ্যে 2। পঙ্ক্টের সাথে একই গল্প। এটি কমপক্ষে 3 টির মধ্যে 2 এবং কেন কম সারি ব্যাখ্যা করে।


বাহ, আপনার বিনিয়োগের জন্য অনেক ধন্যবাদ। এর অর্থ পুরো টেক্সট-অনুসন্ধানটি গুপ্তচর হিসাবে কাজ করে বা কমপক্ষে নথিতে যেমন বলা হয়েছে তেমন কাজ করে। তবে এটি আরও উল্লেখ করে যে পুরো পুরো-পাঠ্য-ইস্যুটি প্রদত্ত শব্দের অংশটি অন্তর্ভুক্ত করে এমন 100% কলামগুলি সন্ধান করতে সহায়তা করবে না যা এটি আমার উদ্দেশ্যে অকেজো করে তোলে। সঠিক ফলাফলের জন্য আমাকে লাইক বা লোকাল দিয়ে অনুসন্ধান করতে হবে যা আশ্চর্যজনকভাবে উভয়ই দ্রুততর বলে মনে হচ্ছে।
32bitfloat

আপনি কেন "পাঙ্কটেন" এবং @ 32 বিটফ্লোট সন্ধান করেন নি ?! পরিবর্তে তিনি "ট্রেফপঙ্ক্ট" পেয়েছিলেন, তবে আপনি তা পান নি। এবং "পাঙ্ক্ট" কেন "প্যাঙ্কটেন" COUNT(IF(MATCHক্যোয়ারিতে ফিরে এসেছে তা আমি সত্যিই বুঝতে পারি না ।
মিলিগাট

আমি ভাবছি ইনোডিবি-তে কী ঘটে happens
রিক জেমস

আপনার COUNT(…)পাঙ্কটম্যাচ এবং পঙ্ক্টম্যাচ কলামগুলিতে কেন আছে ? COUNT(IF(MATCH (meldungstext ) AGAINST ('*pankt*' IN BOOLEAN MODE),1,0))হবে সবসময় ফলে 1, কারণ এটি গণনা করা হয় 1বা 0থেকে ফলাফলের IF(…)
কুইন কমেন্ডেন্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.