簡體   English   中英

PHP 搜索引擎,用於帶索引的文本文件

[英]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) 並希望對文本文件進行字符串搜索(如果可能,使用正則表達式)。 合乎邏輯的方法是:

  1. 將內容存儲在 MySQL 數據庫中並使用 MySQL 查詢(LIKE 's%')執行搜索
  2. 通過 PHP 掃描目錄並在每個文本文件中搜索搜索表達式。

但是對於 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM