2011-08-29 13 views
7

मैं एक सूची के आधार साइट के लिए एक खोज इंजन बनाने के लिए कोशिश कर रहा हूँ। मुद्दा यह है कि मेरे पास bbtags के अंदर जानकारी है (जैसे [b]test[/b] sentence, test का मूल्य 3 पर होना चाहिए, जबकि sentence का मूल्य 1 पर होना चाहिए)।PHP MySQL सी खोज क्वेरी

यहाँ एक सूचकांक का एक उदाहरण है:
My test sentence, my my (है TST-DFS की एक SKU)
डेटाबेस:

|Product| word |relevancy| 
| 1 | my | 3 | 
| 1 | test | 1 | 
| 1 |sentence| 1 | 
| 1 | TST-DFS| 10 | 

लेकिन मैं TST-DFS कैसे मेल खाएंगे उपयोगकर्ता TST DFS में टाइप तो क्या होगा? मैं .. पूर्ण 10 के बजाय कहते हैं कि 8 की प्रासंगिकता है कि SKU, चाहते हैं

मैंने सुना है कि MySQL में पूर्ण पाठ खोज सुविधा की सहायता से, लेकिन मैं एक अच्छा तरीका खोजने के लिए नहीं कर पा रहे कर दो। मैं यूनियनों जैसी चीजों से बचना चाहता हूं, और क्वेरी को जितना संभव हो सके अनुकूलित करना चाहता हूं।

इस के लिए एक अच्छा प्रणाली के साथ आ बहुत अच्छा होगा के साथ कोई भी मदद करते हैं।

धन्यवाद, मैक्स

+0

आप MySQL के 'FULLTEXT' क्षमताओं का उपयोग नहीं कर सकते, या कि तुम क्या मतलब है जब आप कहते हैं कि" सूचकांक "क्या है? – Bojangles

+0

समस्या यह है कि मेरे पास बहुत सारी जानकारी है जो महत्वपूर्ण है, लेकिन MySQL के FULLTEXT को यह नहीं पता है कि यह महत्वपूर्ण है (जैसे स्कू संख्या, उत्पाद का नाम, और अन्य निश्चित शब्द)। तो मैं प्रत्येक उत्पाद में प्रत्येक शब्द को अनुक्रमणित कर रहा हूं, और मुझे विश्वास नहीं है कि MySQL का FULLTEXT मुझे प्रत्येक पंक्तियों के माध्यम से खोजने में मदद करेगा। – Ben

+0

ओह ठीक है। जहां तक ​​मैं देख सकता हूं, नहीं, 'FULLTEXT' बिल्कुल उपयोगी नहीं होगा। वास्तव में एक शर्म की बात है, क्योंकि यह MySQL का एक अद्भुत हिस्सा है। – Bojangles

उत्तर

5

लेकिन मैं TST-डीएफएस कैसे मेल खाते हैं, तो उपयोगकर्ता TST डीएफएस में टाइप?
मैं चाहूँगा की प्रासंगिकता है कि SKU 8 कहते हैं, पूरे 10 के बजाय ..

अगर मैं सवाल का अधिकार मिल गया, इस सवाल का जवाब वास्तव में आसान है।
ठीक है, अगर आप फोर्ज अपनी क्वेरी को mysql पर भेजने से पहले थोड़ा सा प्रश्न पूछें।

ठीक है, मान लें कि हमारे पास $query है और इसमें TST-DFS है।

क्या हम शब्द स्पैन पर ध्यान केंद्रित कर रहे हैं? मुझे लगता है हम चाहिए, के रूप में सबसे खोज इंजन है, इसलिए:

$ok=preg_match_all('#\w+#',$query,$m); 

अब अगर उस पैटर्न का मिलान नहीं हुआ ... $m[0] शब्द $query में की सूची है।
यह आपके एसकेयू के लिए ठीक से ट्यून किया जा सकता है, लेकिन एक और फैशन में पूर्ण शब्दों के खिलाफ मिलान करना उपयोगकर्ता अनुमान लगा रहा है।

(के रूप में यह गूगल और याहू से अधिक होता है) तो हम एक $expr अभिव्यक्ति इंजेक्ट किया जाएगा कि हमारे अंतिम क्वेरी में पकाने के लिए की जरूरत है।

if(!$ok) { // the search string is non-alphanumeric 
    $expr="false"; 
} else { // the search contains words that are no in $m[0] 
    $expr=''; 
    foreach($m[0] as $word) { 
    if($expr) 
     $expr.=" AND "; // put an AND inbetween "LIKE" subexpressions 
    $s_word=addslashes($word); // I put a s_ to remind me the variable 
           // is safe to include in a SQL statement, that's me 
    $expr.="word LIKE '%$s_word%'"; 
    } 
} 

अब $expr तरह "words LIKE '%TST%' AND words LIKE '%DFS%'"

कि मूल्य के साथ

दिखना चाहिए, हम अंतिम क्वेरी निर्माण कर सकते हैं:

$s_expr="($expr)"; 
$s_query=addslashes($query); 

$s_fullquery= 
"SELECT (Product,word,if((word LIKE '$s_query'),relevancy,relevancy-2) as relevancy) ". 
"FROM some_index ". 
"WHERE word LIKE '$s_query' OR $s_expr"; 

कौन सा पढ़ा होगा, "TST-डीएफएस" के लिए:

SELECT (Product,word,if((word LIKE 'TST-DFS'),relevancy,relevancy-2) as relevancy) 
FROM some_index 
WHERE word LIKE 'TST-DFS' OR (word LIKE '%TST%' AND word LIKE '%DFS%') 

जैसा कि आप देख सकते हैं, पहले SELECT लाइन में, अगर मैच आंशिक है, mysql वापस आ जाएगी प्रासंगिकता-2

तीसरे एक में, WHERE खंड, यदि पूर्ण मैच में विफल रहता है, $s_expr, आंशिक मिलान क्वेरी हम अग्रिम में पकाया जाता है, की कोशिश की है बजाय।

+0

सही किया गया। मेरा तर्क गलत था। ** अब ** '$ expr'' की तरह '% TST%' शब्द और शब्दों की तरह '% डीएफएस%' ' – ZJR

+0

तो जहां' relevancy' स्तंभ हो रही है की तरह दिखना चाहिए? – Ben

+0

उपर्युक्त के बारे में कभी भी नहीं, यह बहु-शब्द क्वेरी के साथ कैसे काम करेगा? ऐसा लगता है कि यह स्वयं को पूरी तरह से शब्द या तुलना करने के लिए तुलना कर रहा है, या क्या मैं इसके बारे में सही हूं? – Ben

0

मैं एक स्तंभ है कि सभी विशेष वर्ण का, गलत वर्तनी छीन रहा है, और फिर upcased जोड़ना होगा (या एक समारोह है कि पाठ पर तुलना कि छीन कर दिया गया है और upcased बनाएँ)। इस तरह आपकी प्रासंगिकता सुसंगत रहेगी।

2

मैं मामले सब कुछ कम और बाहर विशेष वर्ण

1

पट्टी (एक फोन नंबर या क्रेडिट कार्ड मैं दोनों पक्षों पर सब कुछ बाहर ले में की तरह है कि एक नंबर नहीं है) के बजाय अपने खुद के FTS बनाने की कोशिश करना चाहते समाधान, आप अपनी आवश्यकताओं के लिए MySQL एफटीएस इंजन फिट करने का प्रयास कर सकते हैं। मैंने जो देखा है वह आपके एफटीएस डेटा को स्टोर करने के लिए एक नई टेबल बना रहा है। प्रत्येक अलग-अलग डेटा के लिए एक कॉलम बनाएं जिसे आप एक अलग प्रासंगिकता चाहते हैं। अपने स्की क्षेत्र के लिए आप रिक्त स्थान, अंडरस्कोर, हाइफ़न और किसी अन्य विशेष चरित्र के साथ कच्चे स्कू को स्टोर कर सकते हैं। फिर इन सभी चीजों को हटाकर एक अलग संस्करण को स्टोर करें। आप अग्रणी शून्यों के साथ एक संस्करण भी स्टोर करना चाहते हैं, क्योंकि लोग अक्सर इस तरह की चीज़ों को छोड़ देते हैं। आप इन सभी भिन्नताओं को एक ही कॉलम में स्टोर कर सकते हैं। अपने उत्पाद का नाम किसी अन्य कॉलम में स्टोर करें, और उत्पाद विवरण किसी अन्य कॉलम में संग्रहीत करें। प्रत्येक कॉलम पर एक अलग इंडेक्स बनाएं। फिर जब आप अपनी खोज करते हैं, तो आप व्यक्तिगत रूप से प्रत्येक कॉलम को खोज सकते हैं, और परिणाम के रैंक को गुणा कर सकते हैं कि कॉलम कितना महत्वपूर्ण है। तो आप स्कू परिणाम 10 से गुणा कर सकते हैं, शीर्षक 5 तक और विवरण के परिणाम छोड़ सकते हैं। आपको अपने इच्छित परिणाम प्राप्त करने के लिए थोड़ा सा प्रयोग करना पड़ सकता है, लेकिन यह अंततः आपकी खुद की अनुक्रमणिका बनाने से सरल हो सकता है।

+0

जैसा दिखने में विशेषज्ञता को लिखने के लिए मेरे पास विवरण में उपशीर्षक से घिरा हुआ बीबीकोड है। क्या मैं बीबीकोड के बीच सब कुछ ले सकता हूं, और एक कॉलम में सभी दुनिया को एक साथ जोड़ सकता हूं (उनके बीच की जगहों के साथ), और उस कॉलम को 3 कहकर गुणा कर सकता हूं? साथ ही, क्या आप विभिन्न गुणकों के साथ पूर्ण टेक्स्ट का उपयोग करने का एक सरल उदाहरण दे सकते हैं? – Ben

+0

यदि आप अपने उत्तर पर विस्तार करने के इच्छुक हैं, तो मुझे इस प्रश्न के लिए एक उपहार देने में खुशी होगी। – Ben

1

एक कीवर्ड तालिका बनाएं। कुछ के साथ कुछ:

integer keywordId (autoincrement) | varchar keyword | int pointValue 

इस तालिका में सभी संभावित कीवर्ड, स्कस इत्यादि असाइन करें।

integer keywordId | integer postId 

बार जब आप इस किया है, तो आप आसानी कीवर्ड एक पोस्ट करने के लिए जोड़ सकते हैं: एक और मेज, एक के बाद कीवर्ड पुल बनाएँ, की तर्ज पर (यह मानते हुए postId आईडी आप अपने मूल तालिका में निर्दिष्ट किए गए है) क्योंकि इसमें दिलचस्पी है। कुल अंक का मान किसी दिए गए पद के लिए, इस तरह के चाल निम्न करना चाहिए के रूप में एक प्रश्न गणना करने के लिए:

SELECT sum(pointValue) FROM keywordPostsBridge kpb 
JOIN keywords k ON k.keywordId = kpb.keywordId 
WHERE kpb.postId = YOUR_INTENDED_POST 
1

मुझे लगता है कि समाधान जब तक मैं कुछ याद काफी सरल है।

मूल रूप से दो खोज चलाने के लिए, एक सटीक मिलान है, अन्य मैच या regex मैच की तरह है।

एक साथ दो परिणामों में शामिल हों, जैसे मैच बाएं सटीक मिलान में शामिल हों। फिर उदाहरण के लिए:

final_relevancy = (IFNULL(like_relevancy, 0) + IFNULL(exact_relevancy, 0) * 3)/4 

हालांकि मैंने इसे स्वयं नहीं किया। एक विचार है।

0
/* 
q and q1 - you table 
this query takes too much resources, 
make from it update-query (scheduled task or call it on_save if you develop new system) 
*/ 
SELECT 
     CASE 
       WHEN word NOT REGEXP "^[a-zA-Z]+$" 
        /*many replace with junk characters 
        or create custom function 
        or if you have full db access install his https://launchpad.net/mysql-udf-regexp 
        */ 
       THEN REPLACE(REPLACE(word, '-', ' '), '#', ' ') 
       ELSE word 
     END word , 
     CASE 
       WHEN word NOT REGEXP "^[a-zA-Z]+$" 
       THEN 8 
       ELSE relevancy 
     END   relevancy 
FROM (SELECT 'my' word, 
       3  relevancy 

     UNION 

     SELECT 'test' word, 
       1  relevancy 

     UNION 

     SELECT 'sentence' word, 
       1   relevancy 

     UNION 

     SELECT 'TST-DFS' word, 
       10 relevancy 
     ) 
     q 

UNION 

SELECT * 
FROM (SELECT 'my' word, 
       3  relevancy 

     UNION 

     SELECT 'test' word, 
       1  relevancy 

     UNION 

     SELECT 'sentence' word, 
       1   relevancy 

     UNION 

     SELECT 'TST-DFS' word, 
       10 relevancy 
     ) 
     q1 
0
it is a page coading where query result shows 

**i can not use functions by use them work are more easier** 

<html> 
<head> 
</head> 
<body> 
<?php 
//author S_A_KHAN 
//date 10/02/2013 
$dbcoonect=mysql_connect("127.0.0.1","root"); 
if (!$dbcoonect) 
{ 
die ('unable to connect'.mysqli_error()); 
} 
else 
{ 
echo "connection successfully <br>"; 

} 
$data_base=mysql_select_db("connect",$dbcoonect); 


if ($data_base==FALSE){ 

die ('unable to connect'.mysqli_error($dbcoonect)); 
    } 
else 
    { 
echo "connection successfully done<br>"; 
    ***$SQLString = "select * from user where id= " . $_GET["search"] . ""; 
$QueryResult=mysql_query($SQLString,$dbcoonect);*** 

echo "<table width='100%' border='1'>\n"; 
    echo "<tr><th bgcolor=gray>Id</th><th bgcolor=gray>Name</th></tr>\n"; 
    while (($Row = mysql_fetch_row($QueryResult)) !== FALSE) { 
     echo "<tr><td bgcolor=tan>{$Row[0]}</td>"; 
     echo "<td bgcolor=tan>{$Row[1]}</td></tr>"; 
    } 
} 
?> 

</body> 
</html> 
संबंधित मुद्दे