簡體   English   中英

搜索引擎關鍵詞解析器

[英]Search Engine Keywords Parser

這是我想做的:

我需要創建一個使用以下運算符的搜索引擎解析器:

  • 蘋果橙子(AND運算符)
  • 蘋果橙子(或運算符)
  • 蘋果和非橙子(和非運算符)
  • 蘋果 (行情運算符)
  • 蘋果AND(橙子 (括號運算符)
  • 應用*(星級經營者)

使用一些preg_replace,我設法將字符串轉換為數組,然后解析該數組以獲取MySQL查詢。 但是我不喜歡這樣,而且非常不穩定!

我在網上搜索了一些腳本,但沒有運氣!

有人可以幫我實現這個嗎?

謝謝

好的,這將是一個很大的答案。

我認為您需要的是一個解析器生成器。 一款可生成代碼以根據給定語法解析文本的軟件。 這些解析器通常具有2個主要組件:詞法分析器和解析器。 詞法分析器識別令牌(單詞),解析器根據您的語法檢查令牌順序是否正確。

在詞法分析器中,您應該聲明以下標記

TOKENS ::= (AND, OR, NOT, WORD, WORDSTAR, LPAREN, RPAREN, QUOTE)
WORD ::= '/w+/'
WORDSTAR ::= '/w+\*/'

語法應定義如下:

QUERY ::= word
QUERY ::= wordstar
QUERY ::= lparen QUERY rparen
QUERY ::= QUERY and QUERY
QUERY ::= QUERY or QUERY
QUERY ::= QUERY and not QUERY
QUERY ::= quote MQUERY quote
MQUERY ::= word MQUERY
MQUERY ::= word

該語法定義了一種具有您所需的所有功能的語言。 根據您使用的軟件,您可以定義函數來處理每個規則。 這樣,您可以將文本查詢轉換為sql where子句。

我不是很喜歡php,但是我在網上搜索了一個解析器生成器, 然后出現了PHP_ParserGenerator

請記住,只要數據庫增長,這些查詢就可能成為結構化存儲系統的問題。

您可能想嘗試一個全文搜索引擎,該引擎可讓您執行此功能以及與文本搜索有關的許多其他功能。 這就是IndexTank的工作方式

首先,將所有數據庫記錄(或文檔)添加(或在搜索方言中“索引”)到IndexTank。

$api = new ApiClient(...);
$index = $api->get_index('my_index');
foreach ($dbRows as $row) {
  $index->add_document($row->id, array('text' => $row->text));
}

之后,您可以使用所需的所有運算符搜索索引

$index = $api->get_index('my_index');
$search_result = $index->search('Apples AND Oranges');
$search_result = $index->search('Apples OR Oranges');
$search_result = $index->search('Apples AND NOT Oranges');
$search_result = $index->search('"apples oranges"');
$search_result = $index->search('Apples AND ( Oranges OR Pears )');
$search_result = $index->search('Appl*');

希望我回答了你的問題。

你看過ANTLR了嗎

您可以進行如下自制程序( 重要: $search字符串必須首先經過清理或被黑)...

if (substr($search[0]=='*' and substr($search,-1)=='*') {
    // *ppl*
    $query = "SELECT * FROM `table` WHERE `field` LIKE (%'". str_replace('*','',$search) ."%')";
} elseif (substr($search,-1)=='*') {
    // Appl*
    $query = "SELECT * FROM `table` WHERE `field` LIKE ('". str_replace('*','',$search) ."%')";
} elseif ($search[0]=='*') {
    // *Appl
    $query = "SELECT * FROM `table` WHERE `field` LIKE ('%". str_replace('*','',$search) ."')";
} elseif (substr_count($search,'"')==2) {
    // " Apples " ... just remove the "
    $query = 'SELECT * FROM `table` WHERE `field` = "'. str_replace('"','',$search) .'"';
} elseif (strpos($search,')') or strpos($search,'(')) {
    // uh ... something more complex here
    $query = '#idunno';
} else {
    // the rest
    $query = 'SELECT * FROM `table` WHERE `field` = "'. $search .'"';
    $search  = array(
        ' AND ',
        ' OR ',
        ' AND NOT '
        );
    $replace = array(
        '" AND `field` = "',
        '" OR `field` = "',
        '" AND `field != "'
        );
    str_replace($search,$replace,$query);
}

試試這個: http : //www.isearchthenet.com/isearch/index.php

從自述文件:

  • 通常使用“可能包含”字詞進行搜索。 匹配項要求輸入的任何單詞都出現在頁面上。
  • 您可以搜索包含特定單詞的頁面,方法是在其前面加上加號(+)。 僅顯示包含該單詞的頁面。
  • 您可以通過在其前面加上減號(-)來忽略所有包含特定單詞的頁面。 包含該單詞的任何頁面都不會顯示在搜索結果中。
  • 您可以通過用雙引號(“)括起來來搜索特定短語。僅顯示包含該確切短語的頁面。

它易於安裝和使用。 另外,請訪問http://sphinxsearch.com/-最強大的引擎,但不適用於新手。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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