Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Solr:在带空格的字符串上使用通配符_Solr_Lucene_Wildcard - Fatal编程技术网

Solr:在带空格的字符串上使用通配符

Solr:在带空格的字符串上使用通配符,solr,lucene,wildcard,Solr,Lucene,Wildcard,我的问题与这里讨论的基本相同:,但这个问题没有得到回答 我在一个名为“brand”的字段的过滤器查询中使用了通配符 当品牌名称中有空格时,我遇到了麻烦。例如,当我说fq={!tag=brand}brand:Lexing*n时,过滤品牌“Lexington”效果很好。然而,像“无神论模特”这样的多词品牌会带来问题。似乎名字周围必须加上双引号 当有“s,*s”时,不要做任何事,即品牌:“无神论模式*”或品牌:“乐星”*“,与任何内容都不匹配。如果没有双引号,可以说brand:Authen*,没有引号

我的问题与这里讨论的基本相同:,但这个问题没有得到回答

我在一个名为“brand”的字段的过滤器查询中使用了通配符

当品牌名称中有空格时,我遇到了麻烦。例如,当我说fq={!tag=brand}brand:Lexing*n时,过滤品牌“Lexington”效果很好。然而,像“无神论模特”这样的多词品牌会带来问题。似乎名字周围必须加上双引号

当有“s,*s”时,不要做任何事,即品牌:“无神论模式*”或品牌:“乐星”*“,与任何内容都不匹配。如果没有双引号,可以说brand:Authen*,没有引号也没有空格,这将匹配真实的模型。但是一旦空白被包含在品牌名称中,它似乎只考虑字符串到匹配时的第一个空间。

“品牌”字段为类型

<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>

据我所知,这不是空白标记。但是,它由一个空白标记字段中的copyField填充


我可以做些什么来阻止Solr在不使用双引号的情况下标记过滤器查询?

尝试将类型从字符串更改为类似文本的类型。字符串类型没有标记化,因此当字符串字段中有空格时,它将尝试匹配您的查询,包括字段中的空格

在默认模式文件中,您可以在字符串字段类型的正上方看到这一行

<!-- The StrField type is not analyzed, but indexed/stored verbatim. -->


使用文本类型应该可以解决您的问题,如text_general或类似的问题。

我在原始问题上添加了一个可能的解决方案

注意,这仅适用于尾随通配符。我知道这个问题示例在字符串中使用了通配符,但它用于回答该问题的一个特定案例


基本上,它相当于使用查询解析器。查看我关于原始问题的帖子,了解更多详细信息,这样我就不会因为重复自己的问题而受到嘲笑。

正如Rob在回答中所说的,我已经发布了他链接的问题

您只需转义查询中的空格(如,
customer\u name:Pop*Tart
-->
customer\u name:Pop\*Tart
)。 根据我的经验,无论您将通配符放在何处,此方法都有效,这是由Solr声称的类似于:

customer_name:Pop\ *Tart
解析为:

customer_name:Pop *Tart

我想我确实想要一个非标记化的字段来存储品牌。我希望能够通过在筛选查询中指定品牌的全名(包括空格)来筛选品牌。我尝试在标记化字段上使用通配符,但它返回的匹配项太过允许…类似于只要求查询的第一个标记与索引中的标记相匹配。当然,对于要用于筛选或排序的字段,使用字符串on对性能有意义,但这样会忽略空间问题。。您可以做一些基准测试来检查字符串和文本字段的性能差异。。或者您可以尝试其他一些技巧,比如对字段的N个首字母或标记进行排序等等。。我不确定您是否可以定义自定义字段,尽管这可能值得一试,但实际上我并不担心性能。我发现对文本字段执行筛选查询会导致不精确的匹配。例如,这为fq生成了匹配项:“我的品牌”不仅像“我的品牌”,而且像“我的品牌Foo”和“我的品牌吧”,等等。我不完全理解这个领域的行为,但我相信它不会满足我的要求。我之所以使用通配符,是因为对于带有TM符号的品牌,我们在匹配它们时遇到了编码问题。我想在查询中用通配符替换TM,并与品牌的其余部分精确匹配。对于TM,您可以使用变压器吗?您可以从字段中替换或删除它,然后不需要使用通配符。对于文本查询的匹配,我建议在schema.xml文件中播放分析器和过滤器。。虽然我认为教程的数量不够好。。你也可以在这里发布你的问题:这是solr/lucene社区的主要列表之一