gpt4 book ai didi

java - Solr 字符串字段搜索包含特殊字符

转载 作者:行者123 更新时间:2023-12-02 11:10:51 26 4
gpt4 key购买 nike

我刚刚开始从事 Solr 工作。有一个电话字段,它已在如下模式中定义

<field docValues="true" indexed="true" multiValued="true" name="phones" stored="true" type="StrField"/>

根据我的理解,字符串字段将尝试进行精确匹配,但用户可以使用任何格式来搜索带有特殊字符(例如(111)111-1111)的电话号码。因此,我使用 ClientUtils.escapeQueryChars 为特殊字符添加斜杠,但搜索不会产生任何结果。我一直试图理解为什么,是否有任何标准不能对字符串字段转义特殊字符?我认为分词器并不重要,因为它是字符串字段,并且我使用 edismax 解析器。有什么想法吗?

最佳答案

使用 Solr 7.3.1 我重现了您所询问的内容,并且只要您正确转义 (, ) 即可确认这一点,您将获得您正在寻找的点击。

架构

  • id:字符串
  • 电话:字符串(多值、文档值、索引、存储)

文件

{
"id":"doc1",
"phones":["(111) 111-1111"],
"_version_":1602190176246824960
},
{
"id":"doc2",
"phones":["111 111-1111"],
"_version_":1602190397829808128
},
{
"id":"doc3",
"phones":["111 (111)-1111"],
"_version_":1602190400002457600
}

查询

/select?q=电话:\(111\)\111-1111

{
"id":"doc1",
"phones":["(111) 111-1111"],
"_version_":1602190176246824960}]
}

/select?debugQuery=on&q=phones:111\111-1111

{
"id":"doc2",
"phones":["111 111-1111"],
"_version_":1602190397829808128}]
}

/select?debugQuery=on&q=phones:1111111111

"response":{"numFound":0,"start":0,"docs":[]}

行为与描述完全相同 - 仅完全匹配。

使用 PatternReplaceCharFilterFactory 获得您想要的行为

让我们创建一个自定义字段类型,删除所有非数字或字母的内容:

curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-field-type" : {
"name":"phoneStripped",
"class":"solr.TextField",
"positionIncrementGap":"100",
"analyzer" : {
"charFilters":[{
"class":"solr.PatternReplaceCharFilterFactory",
"replacement":"",
"pattern":"[^a-zA-Z0-9]"
}],
"tokenizer":{
"class":"solr.KeywordTokenizerFactory"
},
}
}
}' http://localhost:8983/solr/foo/schema

然后,我们使用此新字段类型创建一个名为 phone_stripped 的新字段(您可以在 UI 中执行此操作),并重新索引我们的文档 - 现在使用新字段名称:

  {
"id":"doc1",
"phone_stripped":"(111) 111-1111"
},
{
"id":"doc3",
"phone_stripped":"111 (111)-1111"
},
{
"id":"doc2",
"phone_stripped":"111 111-1111"
}

然后我们只搜索1111111111:

"response":{"numFound":3,"start":0,"docs":[ .. all our docs ..]

使用之前的搜索,phone_stripped:\(111\)\111-1111:

"response":{"numFound":3,"start":0,"docs":[ .. all our docs ..]

为了确保我们没有以无法形容的方式破坏事情,让我们搜索 phone_stripped:\(111\)\111-1112:

"response":{"numFound":0,"start":0,"docs":[]

关于java - Solr 字符串字段搜索包含特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50635861/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com