Solr WhitespaceTokenizerFactory 将使 URL 参数无效
Solr WhitespaceTokenizerFactory will make URL parameter no work
我创建了一个新的字段类型,如下所示:
<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 的工作原理。
如您原来的 post 中所述,这是因为 #
在 HTTP URL 中具有特殊含义。 #
表示本地锚点,永远不会传输到服务器 - 它用于保留对页面中单个点的本地引用(现在 #
后面的值指的是 id
页面在显示时应该滚动到的元素,但之前它引用了一个带有名称的空 a
标签)。
要在 URLs 中使用具有特殊含义的字符(&
也意味着有一个新参数出现而不是被解释为参数的值),你必须转义它们.在 Javascript 中,您可以使用 encodeURIComponent
来执行此操作:
encodeURIComponent("foo#&bar")
-> "foo%23%26bar"
因此,要发送值 foo#&bar
作为参数,并且不引入新参数或本地锚点哈希,该值将作为 foo%23%26bar
发送。您的 HTTP 服务器会自动为您解码。
?q=field%3Afoo%23%26bar
.. 将被解释为 field:foo#&bar
服务器端。由于 ':' 通常可以在 URL 中安全地使用,因此您不必转义它 - 但正确地执行它并没有什么坏处。如果您要在应用程序中执行此操作,请查找 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 的工作原理。
如您原来的 post 中所述,这是因为 #
在 HTTP URL 中具有特殊含义。 #
表示本地锚点,永远不会传输到服务器 - 它用于保留对页面中单个点的本地引用(现在 #
后面的值指的是 id
页面在显示时应该滚动到的元素,但之前它引用了一个带有名称的空 a
标签)。
要在 URLs 中使用具有特殊含义的字符(&
也意味着有一个新参数出现而不是被解释为参数的值),你必须转义它们.在 Javascript 中,您可以使用 encodeURIComponent
来执行此操作:
encodeURIComponent("foo#&bar")
-> "foo%23%26bar"
因此,要发送值 foo#&bar
作为参数,并且不引入新参数或本地锚点哈希,该值将作为 foo%23%26bar
发送。您的 HTTP 服务器会自动为您解码。
?q=field%3Afoo%23%26bar
.. 将被解释为 field:foo#&bar
服务器端。由于 ':' 通常可以在 URL 中安全地使用,因此您不必转义它 - 但正确地执行它并没有什么坏处。如果您要在应用程序中执行此操作,请查找 URL 使用您选择的语言转义。