Solr WhitespaceTokenizerFactory 将使 URL 参数不起作用



我创建了一个新的字段类型,如下所示:

<fieldType name="text_whitespace" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory" rule="unicode" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" rule="unicode" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>

我需要WhitespaceTokenizerFactory来制作特殊字符来索引和搜索,它现在可以工作了,

但我还有其他问题, 当我使用WhitespaceTokenizerFactory时,它将使URL参数不起作用,

例如 http://localhost:8983/solr/Test1/select?defType=dismax&hl.fl=content&hl=on&indent=on&q=%22C#"&qf=content^100&rows=1&wt=json

当我在 Solr Web UI 中使用该参数时,

它将工作并获得结果,

但是当我使用 URL 和相同的参数时,我没有得到任何结果

这是我的约会:

[
{
"id" : "test1",
"title" : "test1# title C*?#",
"content" : "test1# title C*?#",
"dynamic_s": 5
},
{
"id" : "test2",
"title" : "test2 title C#",
"content" : "test2 title C#",
"dynamic_s": 10
},
{
"id" : "test3",
"title" : "test3 title",
"content" : "test3 title",
"dynamic_s": 0
}
]

如果我使用WhitespaceTokenizerFactory,如何使参数在URL中工作?

这与Solr无关,但就是HTTP的工作方式。

正如您的原始帖子中所解释的,这是因为#在HTTP URL中具有特殊含义。#表示本地锚点,并且永远不会传输到服务器 - 它用于保留对页面中单个点的本地引用(如今#后面的值是指页面在显示时应滚动到的元素的id,但早些时候它引用了一个带有名称的空a标记)。

要在URL中使用具有特殊含义的字符(&也意味着有一个新的参数出现,而不是被解释为参数的值),你必须转义它们。在 Javascript 中,您可以使用encodeURIComponent来执行此操作:

encodeURIComponent("foo#&bar")
-> "foo%23%26bar"

因此,要将值foo#&bar作为参数发送,而不引入新参数或本地锚点哈希,该值将作为foo%23%26bar发送。您的HTTP服务器将自动为您解码。

?q=field%3Afoo%23%26bar

.. 将被解释为field:foo#&bar服务器端。由于":"通常可以在URL中安全使用,因此您不必对其进行转义 - 但是正确执行此操作并没有什么坏处。如果要在应用程序中执行此操作,请以您选择的语言查找 URL 转义。

最新更新