मेरे पास ऐसे लोगों के नाम हैं जो वर्तमान में 35 मिलियन पंक्तियां हैं। मुझे यह जानने की जरूरत है कि इन नामों को तेज़ी से खोजने के लिए सबसे अच्छी विधि क्या है। वर्तमान प्रणाली (मेरे द्वारा डिज़ाइन नहीं की गई) में, केवल पहले और अंतिम नाम कॉलम अनुक्रमित हैं और SOUNDEX का उपयोग करने के अतिरिक्त विकल्प के साथ "LIKE" क्वेरी का उपयोग करते हैं (हालांकि मुझे यकीन नहीं है कि यह वास्तव में बहुत अधिक उपयोग किया जाता है)। प्रदर्शन हमेशा इस प्रणाली के साथ एक समस्या रहा है, और इसलिए वर्तमान में खोज 200 परिणामों तक सीमित हैं (जो अभी भी चलाने में बहुत अधिक समय लेती हैं)। तो, मेरे पास कुछ प्रश्न हैं:एसक्यूएल सर्वर खोज उचित नाम पूर्ण पाठ सूचकांक बनाम LIKE + SOUNDEX
- क्या पूर्ण पाठ अनुक्रमणिका उचित नामों के लिए अच्छी तरह से काम करती है?
- यदि हां, तो उचित नाम पूछने का सबसे अच्छा तरीका क्या है? (कंटेनर, FREETEXT, आदि)
- क्या कोई अन्य सिस्टम (Lucene.net की तरह) है जो बेहतर होगा?
बस संदर्भ के लिए, मैं डेटा एक्सेस के लिए फ्लुएंट एनएचबेर्नेट का उपयोग कर रहा हूं, इसलिए इसके साथ काम करने वाली विधियों को प्राथमिकता दी जाएगी। मैं वर्तमान में SQL सर्वर 2008 का उपयोग कर रहा हूँ।
संपादित मैं जोड़ने के लिए है कि मैं बहुत समाधान है कि आमतौर पर गलत वर्तनी नाम जैसी चीजों के साथ सौदा होगा में रुचि है, जैसे 'Smythe', 'स्मिथ', साथ ही पहला नाम है, जैसे 'टॉमस' कर रहा हूँ चाहता हूँ ' थॉमस '।
क्वेरी योजना से ऊपर के लिए
|--Parallelism(Gather Streams)
|--Nested Loops(Inner Join, OUTER REFERENCES:([testdb].[dbo].[Test].[Id], [Expr1004]) OPTIMIZED WITH UNORDERED PREFETCH)
|--Hash Match(Inner Join, HASH:([testdb].[dbo].[Test].[Id])=([testdb].[dbo].[Test].[Id]))
| |--Bitmap(HASH:([testdb].[dbo].[Test].[Id]), DEFINE:([Bitmap1003]))
| | |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([testdb].[dbo].[Test].[Id]))
| | |--Index Seek(OBJECT:([testdb].[dbo].[Test].[IX_Test_LastName]), SEEK:([testdb].[dbo].[Test].[LastName] >= 'WHITDþ' AND [testdb].[dbo].[Test].[LastName] < 'WHITF'), WHERE:([testdb].[dbo].[Test].[LastName] like 'WHITE%') ORDERED FORWARD)
| |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([testdb].[dbo].[Test].[Id]))
| |--Index Seek(OBJECT:([testdb].[dbo].[Test].[IX_Test_FirstName]), SEEK:([testdb].[dbo].[Test].[FirstName] >= 'THOMARþ' AND [testdb].[dbo].[Test].[FirstName] < 'THOMAT'), WHERE:([testdb].[dbo].[Test].[FirstName] like 'THOMAS%' AND PROBE([Bitmap1003],[testdb].[dbo].[Test].[Id],N'[IN ROW]')) ORDERED FORWARD)
|--Clustered Index Seek(OBJECT:([testdb].[dbo].[Test].[PK__TEST__3214EC073B95D2F1]), SEEK:([testdb].[dbo].[Test].[Id]=[testdb].[dbo].[Test].[Id]) LOOKUP ORDERED FORWARD)
एसक्यूएल:
CREATE INDEX IX_Test_Name_DOB
ON Test (LastName ASC, FirstName ASC, BirthDate ASC)
INCLUDE (and here I list the other columns)
मेरे खोज अब कर रहे हैं:
SELECT * FROM testdb.dbo.Test WHERE LastName LIKE 'WHITE%' AND FirstName LIKE 'THOMAS%'
मिच से सलाह के आधार पर, मैं इस तरह एक सूचकांक बनाया मेरी सामान्य खोज (आखिरी, पहली, और जन्म तिथि) के लिए अविश्वसनीय रूप से तेज़।
क्या आप टीएसक्यूएल भी पोस्ट कर सकते हैं? –