0

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

所以我想进行一个查询,它将获取所有名字为“Иван”和姓氏“Петров”的名字;第二个名字无关紧要,所以我会放*输入通配符。

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

我尝试过的:

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

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

完美 - 它找到我想要的 - 所有名字都有名字Иван和姓氏Петров

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

我该如何解决这个问题!

4

2 回答 2

0

我认为您不需要通配符查询。text_ws如果您只在索引时间(

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

或者

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

更新:在您发表评论后,我看到这将进行词袋搜索并且不会保留顺序。我想你需要保留一个字符串复制字段name比如说name_str,这会给你更多的搜索选项。例如,如果查询中有 2 个空格,这意味着您获得了名字、中间名和姓氏,那么您可以对name_strlike进行完全匹配

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

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

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

将匹配以 . 开头ИВАН和结尾的任何内容ПЕТРОВ

甚至

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

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

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

于 2013-02-19T18:28:11.580 回答
0

尝试在您的 text_ws 类型定义中添加autoGeneratePhraseQueries="true"标志。并使用 debugQuery=true 标志来查看它是如何与字段匹配的。如果基本工作正常,您可以查看eDismax 配置中的 pf3 标志来提升查询匹配。

Solr 还带有专用的俄语标记过滤器,但您可能并不关心这些人的名字。

于 2013-02-19T11:25:14.803 回答