[英]PHP search engine for text files with indexing
我在一個目錄(及其子目錄)中有一些文本文件。 文本文件的數量將是(50000+)並且目錄在“public_html”之外:
text_root_dir
|-- |-- `001
|-- text0003.txt
|-- text0004.txt
|-- text0005.txt
|-- `001_a
|-- text0006.txt
|-- text0007.txt
|-- text0008.txt
|-- text0001.txt
|-- text0002.txt
文本文件詳細信息保存在 MySQL 表中(“ art_textfile ”存儲文本文件名,“ art_path ”列存儲文件路徑):
CREATE TABLE `stxt_articles` (
`art_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,
`art_title` VARCHAR(127) NOT NULL,
`art_author` VARCHAR(255) NOT NULL,
`art_textfile` VARCHAR(255) NOT NULL, /* TEXT FILE NAME */
`art_path` VARCHAR(255) NOT NULL, /* TEXT FILE PATH */
PRIMARY KEY(`art_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
我正在使用 PHP/MySQL (LAMP) 並希望對文本文件進行字符串搜索(如果可能,使用正則表達式)。 合乎邏輯的方法是:
但是對於 5000 + 個文件的大型數據集(隨着時間的推移會增長),上述選項並不實用。 使用起來會太慢。
我正在尋找的是一個 PHP/MySQL 搜索想法,它為文本文件創建索引並進行搜索。 Lucene 在 JAVA 中所做的幾乎一樣。 也許我可以將其稱為 PHP 和 MySQL 中的 lucene 替代品。
感謝您閱讀本文。 也感謝您的想法。
使用 AJAX 之類的東西似乎很快,如果我誤解了你的帖子,我很抱歉。 (代碼需要調整才能完全按照您的意願進行,但應該是一個很好的起點)
索引.html
<html>
<head>
<script>
function showResult(str) {
if (str.length==0) {
document.getElementById("search").innerHTML="";
document.getElementById("search").style.border="0px";
return;
}
var xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function() {
if (this.readyState==4 && this.status==200) {
document.getElementById("search").innerHTML=this.responseText;
document.getElementById("search").style.border="1px solid #A5ACB2";
}
}
xmlhttp.open("GET","search.php?q="+str,true);
xmlhttp.send();
}
</script>
</head>
<body>
<form>
<input type="text" size="30" onkeyup="showResult(this.value)">
<div id="search"></div>
</form>
</body>
</html>
搜索.php
<?php
//get the q parameter from URL
$files = scandir("FOLDER")
$q=$_GET["q"];
//lookup all links from the xml file if length of q>0
if (strlen($q)>0) {
$hint="";
$directory = 'Directory';
$results_array = array();
if (is_dir($directory)) {
if ($handle = opendir($directory)) {
while(($file = readdir($handle)) !== FALSE) {
$results_array[] = $file;
}
closedir($handle);
}
}
foreach($results_array as $value) {
if(str_starts_with($value, $q)){
echo $value;
}
}
單獨打開 50000 個文件需要很長時間。 這不包括搜索每個文本的時間。
將數據加載到 ENGINE=InnoDB(不是已棄用的 MyISAM)的 MySQL 表中。 然后,您可以進行非常快速的“面向單詞”的查詢——這符合 FULLTEXT 的限制。
您還可以執行LIKEs
(慢)或REGEXPs
(甚至更慢)。
我在這種情況下所做的是允許用戶使用 LIKE 語法或 REGEXP 語法或簡單的單詞。 添加FULLTEXT(txt)
(假設txt
包含您需要搜索的所有文本)。 然后我的代碼類似於:
如果它看起來像至少 3 個字母的“單詞”,請在每個單詞前面加上一個 '+' 並構建MATCH(txt) AGAINST ("+John +Doe" IN BOOLEAN MODE)
。 在大多數情況下,它會非常快。
否則,如果我看到 %,那么我構建一個LIKE
表達式並假設用戶知道LIKE
語法。
否則,如果我假設它是一個正則表達式和 go 沿着那條路徑。
它是不完美的,但它涵蓋了很多基礎。
如果用戶理解“單詞”更快,他們就會被這種方式吸引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.