选择什么字段类型以及如何查看查询

时间:2013-02-19 10:33:32

标签: solr

问题在于:我有一个列(名为名称),其中包含示例“ИванКириловПетров”,“НинаСемоваМариножа”等的名称。

所以我想做一个查询,它将获得名字'Иван'和姓氏'Петров'的所有名字;第二个名字并不重要,所以我将*通配符。

还有一个更大的问题:如果用户写“ИванКириловПетров”以找到这个确切的人,我应该能够

我的尝试:

我制作了字段text_ws类型 并测试了以下查询:

q=name:Иван*Петров

完美 - 它找到了我想要的东西 - 所有名字都有Иван和最后Петров;

但后来我想找到ИванКириловПетров我没有得到回复,因为我想做一个精确的搜索,我的类型应该是字符串

我该如何解决这个问题呢?

2 个答案:

答案 0 :(得分:0)

尝试在text_ws类型定义中添加autoGeneratePhraseQueries="true"标志。并使用debugQuery = true标志来查看它如何与字段匹配。如果基本功能有效,您可以查看pf3 flag in eDismax configuration以增强查询匹配。

Solr还为俄语提供了专用的令牌过滤器,但你可能并不关心这些人的名字。

答案 1 :(得分:0)

我认为你不需要外卡查询。如果您只是在索引时间(text_ws)中拆分空白区域并且您获得完整的查询的第一个,最后一个和/或中间名称,则可以执行AND查询,如

q=name:(Иван AND Петров)

q=name:(ИВАН AND МИНЧЕВ AND ПЕТРОВ)

更新:在您发表评论后,我发现这会进行单词搜索,并且不会保留订单。我想你需要保留name的字符串copy field,比如说name_str,它会为你提供更多的搜索选项。例如,如果查询中有2个空格,意味着您获得了第一个,中间名和姓氏,那么您可以在name_str上进行完全匹配,例如

q=name_str:"ИВАН%20МИНЧЕВ%20ПЕТРОВ"

如果您使用的是Solr 4.0及更高版本,那么字符串字段上的正则表达式查询可以帮助您。你可以做到

q=name_str:/ИВАН.*ПЕТРОВ/

将匹配以ИВАН开头并以ПЕТРОВ结尾的所有内容。

甚至

q=name_str:/Иван.*?Кирилов.*?Петров/

不幸的是,目前还没有关于正则表达式搜索的Solr wiki页面,但你可以谷歌搜索。

您需要区分要执行的不同类型的查询,并执行不同的搜索。也许为您的用户提供一个复选框,询问他们是否想要完全匹配。