如何在 solr 搜索中找到确切的关键字?
How to find exact keywords in solr search?
实际上,我在 solr 搜索中遇到了一个问题。
有一个作者字段,我在其中存储了两个值,如 "deep kumar-singh" 和 "deep kumar singh"。
当我搜索 author:"deep kumar-singh" 它 returns 两个结果。
但我只希望一个结果是准确的。
这是我的字段描述:
<field name="author" type="text_general" indexed="true" stored="true" multiValued="true"/>
我创建了 authorFacet 字段来获取作者方面。
<field name="authorFacet" type="string_ci" indexed="true" stored="false" multiValued="true"/>
当我选择 authorFacet 时 returns 两个作者都算 1
喜欢:
深库马尔-辛格(1)
深库马尔·辛格(1)
我只想要一个准确的结果。
我怎样才能得到这个?任何建议都会很有帮助。
将 author
的 fieldType
更改为 text_general
的字符串并重新索引数据。
你会得到想要的结果。作为字符串类型的字段,它不会创建单词的任何标记,有助于实现精确匹配。
另外,从solr管理页面也可以分析出来。
转到 solr 管理页面。 Select core/collection。
点击分析。您可以 select 该字段并检查索引时间标记和查询时间是否符合您的预期。
有了这个,您不需要 2 个不同的作者字段。
您可以使用一个包含字符串的字段,因为字段类型可用于分面和搜索。
如果您想要完全匹配,那么您应该使用字符串字段类型而不是文本字段。字符串字段按原样存储,根本没有对它们进行任何转换。
<field name="author" type="string" indexed="true" stored="true" multiValued="true"/>
请记住,如果您使用字符串,则 "abc" 将不同于 "abc."(注意额外的句点)或 "abc "(注意额外的 space ).如果您想以不同的方式处理这些情况,则精确搜索的概念实际上非常复杂(请参阅 )
您可以通过在索引和查询分析器中添加一个 charFilter 来修改您的字段类型,如下所示:
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[-]" replacement=""/>
请注意,charFilter 必须放在分词器之前。基本上,您要在标记化之前删除连字符。
因此,如果您搜索:
- "deep",你得到 "deep kumar-singh" 和 "deep kumar singh"。
- "kumar-singh",你只得到"deep kumar-singh"。
- "kumar singh",你只得到"deep kumar singh"。
我相信,这就是你需要的。
如果您不想更改 text_general 字段类型,您可以使用与 text_general 相同的分析器创建另一个字段类型,并将 charFilter 添加到新字段类型。
实际上,我在 solr 搜索中遇到了一个问题。 有一个作者字段,我在其中存储了两个值,如 "deep kumar-singh" 和 "deep kumar singh"。 当我搜索 author:"deep kumar-singh" 它 returns 两个结果。 但我只希望一个结果是准确的。
这是我的字段描述:
<field name="author" type="text_general" indexed="true" stored="true" multiValued="true"/>
我创建了 authorFacet 字段来获取作者方面。
<field name="authorFacet" type="string_ci" indexed="true" stored="false" multiValued="true"/>
当我选择 authorFacet 时 returns 两个作者都算 1 喜欢:
深库马尔-辛格(1)
深库马尔·辛格(1)
我只想要一个准确的结果。
我怎样才能得到这个?任何建议都会很有帮助。
将 author
的 fieldType
更改为 text_general
的字符串并重新索引数据。
你会得到想要的结果。作为字符串类型的字段,它不会创建单词的任何标记,有助于实现精确匹配。
另外,从solr管理页面也可以分析出来。 转到 solr 管理页面。 Select core/collection。 点击分析。您可以 select 该字段并检查索引时间标记和查询时间是否符合您的预期。
有了这个,您不需要 2 个不同的作者字段。 您可以使用一个包含字符串的字段,因为字段类型可用于分面和搜索。
如果您想要完全匹配,那么您应该使用字符串字段类型而不是文本字段。字符串字段按原样存储,根本没有对它们进行任何转换。
<field name="author" type="string" indexed="true" stored="true" multiValued="true"/>
请记住,如果您使用字符串,则 "abc" 将不同于 "abc."(注意额外的句点)或 "abc "(注意额外的 space ).如果您想以不同的方式处理这些情况,则精确搜索的概念实际上非常复杂(请参阅
您可以通过在索引和查询分析器中添加一个 charFilter 来修改您的字段类型,如下所示:
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[-]" replacement=""/>
请注意,charFilter 必须放在分词器之前。基本上,您要在标记化之前删除连字符。
因此,如果您搜索:
- "deep",你得到 "deep kumar-singh" 和 "deep kumar singh"。
- "kumar-singh",你只得到"deep kumar-singh"。
- "kumar singh",你只得到"deep kumar singh"。
我相信,这就是你需要的。
如果您不想更改 text_general 字段类型,您可以使用与 text_general 相同的分析器创建另一个字段类型,并将 charFilter 添加到新字段类型。