Solr WhitespaceTokenizerFactory将使URL参数无效

时间:2018-03-16 07:08:47

标签: search solr special-characters highlight

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

<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参数无效,

e.g。 http://localhost:8983/solr/Test1/select?defType=dismax&hl.fl=content&hl=on&indent=on&q=%22C#&#34;&安培; QF =内容^ 100安培;行= 1&安培;重量= 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中起作用?

1 个答案:

答案 0 :(得分:1)

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

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

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

encodeURIComponent

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

foo%23%26bar

..将被解释为?q=field%3Afoo%23%26bar 服务器端。因为':'通常可以在URL中安全使用,所以你不必逃避它 - 但是正确地做它并没有什么坏处。如果您要在应用程序中执行此操作,请以您选择的语言查找URL转义。