Sphinx 搜索缺失结果
Sphinx Search missing results
我正在使用 Sphinx 和 Symfony2 在我的数据库中搜索人员。
奇怪的行为是:
我搜索 Jim J 结果是:
- 詹姆斯'Jim'歌手
- 吉姆·亚伯拉罕
- 吉姆·安德森
- 吉姆巴克斯
- 吉姆·本农
- ...
如果我搜索 Jim Ja,结果是:
- 詹姆斯'Jim'歌手
- 吉姆·詹森
- 吉姆·贾木许
- ...
如果我只搜索 Jim J,为什么我会错过 "Ja" 结果,但我得到了所有其他结果?
这里是源代码和索引代码:
source peopleautocomplete {
sql_query = SELECT id, firstName, lastName, pseudonym FROM Person
sql_attr_string = pseudonym
sql_attr_string = firstName
sql_attr_string = lastName
}
index peopleautocomplete
{
source = peopleautocomplete
path = /var/lib/sphinxsearch/data/peopleautocomplete
docinfo = extern
charset_type = utf-8
min_word_len = 2
enable_star = 1
min_prefix_len = 1
}
和 php 代码:
<?php
$q = $request->query->get('q');
$aq = explode(' ', $q);
if (strlen($aq[count($aq) - 1]) < 2) {
$query = $q;
} else {
$query = $q . '*';
}
$result = $this->_getSearchEngine()->searchEx($query, 'peopleautocomplete');
?>
有什么想法吗?
Why am i missing the "Ja" results if i just search for Jim J, but i get all the others?
搜索词 'Jim' 和 'J' 都与 Jim 匹配。所以 Jim Abrahams
是有效的(它匹配两个查询词)。其他人不是 'missing' 他们只是因为比赛太多而跌落了底部。
可以只使用 "Jim J"
将它们作为词组进行搜索(您的代码应添加所需的星标)- 需要两个匹配词。
但这将不允许使用中间名。允许这几个选项
http://sphinxsearch.com/docs/current.html#extended-syntax
也许最简单的是严格顺序运算符。
Jim << J
或者如果想让人们输入姓氏,然后输入姓氏,可以只使用接近度甚至 NEAR
编辑:再看一遍,您的代码实际上并没有正确添加星号。它添加到每个 space 分隔的标记,即使它本身是一个运算符。
<?php $query = preg_replace('/(\w{2,}\b)/','*',$query);
更有效,更紧凑!
或 expand_keywords
索引上的选项以透明地进行。
我正在使用 Sphinx 和 Symfony2 在我的数据库中搜索人员。
奇怪的行为是:
我搜索 Jim J 结果是:
- 詹姆斯'Jim'歌手
- 吉姆·亚伯拉罕
- 吉姆·安德森
- 吉姆巴克斯
- 吉姆·本农
- ...
如果我搜索 Jim Ja,结果是:
- 詹姆斯'Jim'歌手
- 吉姆·詹森
- 吉姆·贾木许
- ...
如果我只搜索 Jim J,为什么我会错过 "Ja" 结果,但我得到了所有其他结果?
这里是源代码和索引代码:
source peopleautocomplete {
sql_query = SELECT id, firstName, lastName, pseudonym FROM Person
sql_attr_string = pseudonym
sql_attr_string = firstName
sql_attr_string = lastName
}
index peopleautocomplete
{
source = peopleautocomplete
path = /var/lib/sphinxsearch/data/peopleautocomplete
docinfo = extern
charset_type = utf-8
min_word_len = 2
enable_star = 1
min_prefix_len = 1
}
和 php 代码:
<?php
$q = $request->query->get('q');
$aq = explode(' ', $q);
if (strlen($aq[count($aq) - 1]) < 2) {
$query = $q;
} else {
$query = $q . '*';
}
$result = $this->_getSearchEngine()->searchEx($query, 'peopleautocomplete');
?>
有什么想法吗?
Why am i missing the "Ja" results if i just search for Jim J, but i get all the others?
搜索词 'Jim' 和 'J' 都与 Jim 匹配。所以 Jim Abrahams
是有效的(它匹配两个查询词)。其他人不是 'missing' 他们只是因为比赛太多而跌落了底部。
可以只使用 "Jim J"
将它们作为词组进行搜索(您的代码应添加所需的星标)- 需要两个匹配词。
但这将不允许使用中间名。允许这几个选项 http://sphinxsearch.com/docs/current.html#extended-syntax
也许最简单的是严格顺序运算符。
Jim << J
或者如果想让人们输入姓氏,然后输入姓氏,可以只使用接近度甚至 NEAR
编辑:再看一遍,您的代码实际上并没有正确添加星号。它添加到每个 space 分隔的标记,即使它本身是一个运算符。
<?php $query = preg_replace('/(\w{2,}\b)/','*',$query);
更有效,更紧凑!
或 expand_keywords
索引上的选项以透明地进行。