我在使用 AJAX 和 PHP 创建多字段实时搜索引擎时遇到问题。
到目前为止,不需要搜索多个字段,所以我有一个简单的查询,它只适用于一个字段。
由于使用onkeyup
功能进行实时搜索,我发现了一些问题。我需要解释的第一个问题:
表的结构非常简单:zipcode | city
例如,有人输入12345
;当然,这将是邮政编码。但是如果有人输入12345 hometown
,那么第一个关键字是邮政编码,第二个是城市怎么办?
关键字将通过使用进行拆分,preg_split('/[\s]+/', $search_term)
因此我收到一个包含将要搜索的单个关键字的数组。在上述情况下,它将是:key[0] => 12345
和key[1] => hometown
。
我使用的查询是这样的:
$where = "";
$search_term = preg_split('/[\s]+/', $search_term); //splits the whole string into single keywords
$total_search_terms = count($search_term); //counts the array-keys from $search_term
foreach ($search_term as $key=>$single_term) {
$where .= "`zipcode` LIKE '$single_term%' OR `city` LIKE '$single_term%' ";
if ($key != ($total_search_terms - 1)){ //adds AND to the query in case in case of a non empty array-key
$where .= " AND ";
}
}
$query = $db->query("SELECT COUNT(*) FROM table WHERE $where");
...
好的,到目前为止一切顺利。现在的问题是关键字可以一次又一次地匹配每个字段。
再举一个例子:
如果从上面输入12345 hometown
,则表示key[0] => 12345
可以匹配字段zipcode
OR city
。此条件等于key[1] => hometown
,甚至可以匹配字段zipcode
OR city
。因此,即使以其他方式输入:也hometown 12345
意味着相同。
这是我遇到的第一个问题。
我正在寻找一种逻辑来构建查询。所以在进入的情况下,12345 hometown
我想要这样的东西:
当key[0] => 12345
匹配字段zipcode
不检查key[1] => hometown
是否在zipcode
OR中匹配,city
因为key[0]
匹配已经在zipcode
所以它key[1]
需要是非常合乎逻辑的city
。
更新
好的,说我的第二个问题,我想让你看看他的回答,david strachan
他提到当 city 包含多个字符串时会引起问题。假设搜索字符串类似于:
12345 New York
关键是:
key[0] => 12345, key[1] => New, key[2] => York
好的,现在的问题是我可以检查其中一个键是否包含整数,如果字符串长度正好为 5,我知道它将是邮政编码。
key[0] => 12345 //if ( stringlen(key[0|) === 5) === true && is_int(key[0]) === true) {zipcode}
到目前为止一切都很好,但真正的问题是城市字符串背后的逻辑。我的第一个想法是我可以说所有不包含整数的键都必须是城市,这样我就可以将它们转换为一个键。
key[1] => New, key[2] => York //if ( !is_int(key[1|) === true && !is_int(key[2|) === true) {$create_one_key = array_fill_keys(key[1], key[1]+key[2]);}
好的,但是如果我以后想添加街道名称怎么办?我不知道如何区分和测试街道名称,甚至城市名称。