【问题标题】:Solr highlighting - terms with umlaut not found/not highlightedSolr 突出显示 - 未找到/未突出显示变音符号的术语
【发布时间】:2018-08-22 21:14:42
【问题描述】:

我正在玩 7.2 版本的 solr。我上传了一组不错的德语文本,并尝试查询和突出显示一些查询。

如果我使用高亮触发此查询:

http://localhost:8983/solr/trans/select?q=trans:Zeit&hl=true&hl.fl=trans&hl.q=Kundigung&hl.snippets=3&wt=xml&rows=1

我收到了很好的回复:

<response>
    <lst name="responseHeader">
        <bool name="zkConnected">true</bool>
        <int name="status">0</int>
        <int name="QTime">10</int>
        <lst name="params">
            <str name="hl.snippets">3</str>
            <str name="q">trans:Zeit</str>
            <str name="hl">true</str>
            <str name="hl.q">Kundigung</str>
            <str name="hl.fl">trans</str>
            <str name="rows">1</str>
            <str name="wt">xml</str>
        </lst>
    </lst>
    <result name="response" numFound="418" start="0" maxScore="1.6969817">
        <doc>
            <str name="id">x</str>
            <str name="trans">... Zeit  ...</str>
            <date name="t">2018-03-01T14:32:29.400Z</date>
            <int name="l">2305</int>
            <long name="_version_">1594374122229465088</long>
        </doc>
    </result>
    <lst name="highlighting">
        <lst name="x">
            <arr name="trans">
                <str> ... <em>Kündigung</em> ... </str>
                <str> ... <em>Kündigung</em> ... </str>
            </arr>
        </lst>
    </lst>
</response>

但是,如果我提供 Kündigung 作为突出显示文本,我将得不到任何答案,因为文本/查询解析器将所有 ü 字符替换为 u

我觉得我需要提供正确的 qparser。我应该如何指定它?在我看来,该集合是使用默认的 LuceneQParser 解析器构建和查询的。如何在上面的 url 中提供这个解析器?

更新:

http://localhost:8983/solr/trans/schema/fields/trans返回

{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "field":{
    "name":"trans",
    "type":"text_de",
    "indexed":true,
    "stored":true}}

更新 2:所以我查看了我的 solr 安装/收集架构配置的托管架构,发现以下内容:

  <fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.StopFilterFactory" format="snowball" words="lang/stopwords_de.txt" ignoreCase="true"/>
      <filter class="solr.GermanNormalizationFilterFactory"/>
      <filter class="solr.GermanLightStemFilterFactory"/>
    </analyzer>
  </fieldType>

我解释信息的方式是,由于省略了查询和索引部分,因此上述代码对于查询和索引都是相同的。其中...没有显示任何类似于the answer 2 below...的错误配置问题...

不过我记得,添加字段trans 和类型text_de

curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-field":{
     "name":"trans",
     "type":"text_de",
     "stored":true,
     "indexed":true}
}' http://localhost:8983/solr/trans/schema

我已经使用

删除了所有文档
curl http://localhost:8983/solr/trans/update?commit=true -d "<delete><query>*:*<
/query></delete>"

然后重新插入它们:

curl  -X POST http://localhost:8983/solr/trans/update?commit=true -H "Content-Type: application/json" -d @all.json

在solr中“重建”索引是否正确?

更新 3:标准 JAVA 安装的字符集设置未设置为 UTF-8:

C:\tmp>java -classpath . Hello
Cp1252
Cp1252
windows-1252

C:\tmp>cat Hello.java
public class Hello {
 public static void main(String args[]) throws Exception{
  // not crossplateform safe
  System.out.println(System.getProperty("file.encoding"));
  // jdk1.4
  System.out.println(
     new java.io.OutputStreamWriter(
        new java.io.ByteArrayOutputStream()).getEncoding()
     );
  // jdk1.5
  System.out.println(java.nio.charset.Charset.defaultCharset().name());
  }
}

更新 4:使用 UTF8 设置重新启动 solr:

bin\solr.cmd start -Dfile.encoding=UTF8 -c -p 8983 -s example/cloud/node1/solr
bin\solr.cmd start -Dfile.encoding=UTF8 -c -p 7574 -s example/cloud/node2/solr -z localhost:9983

检查 JVM 设置:

http://localhost:8983/solr/#/~java-properties



file.​encoding    UTF8
file.​encoding.​pkg    sun.io

重新插入文档。没有变化:http://localhost:8983/solr/trans/select?q=trans:Zeit&amp;hl=true&amp;hl.fl=trans&amp;hl.q=Kundigung&amp;hl.qparser=lucene&amp;hl.snippets=3&amp;rows=1&amp;wt=xml 给出:

<lst name="highlighting">
    <lst name="32e42caa-313d-45ed-8095-52f2dd6861a1">
        <arr name="trans">
            <str> ... <em>Kündigung</em> ...</str>
            <str> ... <em>Kündigung</em> ...</str>
        </arr>
    </lst>
</lst>

http://localhost:8983/solr/trans/select?q=trans:Zeit&amp;hl=true&amp;hl.fl=trans&amp;hl.q=K%C3%BCndigung&amp;hl.qparser=lucene&amp;hl.snippets=3&amp;rows=1&amp;wt=xml 给出:

<lst name="highlighting">
    <lst name="32e42caa-313d-45ed-8095-52f2dd6861a1"/>
</lst>

uchardet all.json (file -bi all.json) 举报UTF-8

windows下从ubuntu子系统运行:

$ export LC_ALL='en_US.UTF-8'
$ export LC_CTYPE='en_US.UTF-8'
$ curl -H "Content-Type: application/json" http://localhost:8983/solr/trans/query?hl=true\&hl.fl=trans\&fl=id -d '
{
  "query" : "trans:Kündigung",
  "limit" : "1", params: {"hl.q":"Kündigung"}
}'
{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":21,
    "params":{
      "hl":"true",
      "fl":"id",
      "json":"\n{\n  \"query\" : \"trans:Kündigung\",\n  \"limit\" : \"1\", params: {\"hl.q\":\"Kündigung\"}\n}",
      "hl.fl":"trans"}},
  "response":{"numFound":124,"start":0,"maxScore":4.3724422,"docs":[
      {
        "id":"b952b811-3711-4bb1-ae3d-e8c8725dcfe7"}]
  },
  "highlighting":{
    "b952b811-3711-4bb1-ae3d-e8c8725dcfe7":{}}}
$ curl -H "Content-Type: application/json" http://localhost:8983/solr/trans/query?hl=true\&hl.fl=trans\&fl=id -d '
{
  "query" : "trans:Kündigung",
  "limit" : "1", params: {"hl.q":"Kundigung"}
}'
{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":18,
    "params":{
      "hl":"true",
      "fl":"id",
      "json":"\n{\n  \"query\" : \"trans:Kündigung\",\n  \"limit\" : \"1\", params: {\"hl.q\":\"Kundigung\"}\n}",
      "hl.fl":"trans"}},
  "response":{"numFound":124,"start":0,"maxScore":4.3724422,"docs":[
      {
        "id":"b952b811-3711-4bb1-ae3d-e8c8725dcfe7"}]
  },
  "highlighting":{
    "b952b811-3711-4bb1-ae3d-e8c8725dcfe7":{
      "trans":[" ... <em>Kündigung</em> ..."]}}}

更新 5 不提供 hl.qhttp://localhost:8983/solr/trans/select?q=trans:Kundigung&amp;hl=true&amp;hl.fl=trans&amp;hl.qparser=lucene&amp;hl.snippets=3&amp;rows=1&amp;wt=xmlhttp://localhost:8983/solr/trans/select?q=trans:K%C3%BCndigung&amp;hl=true&amp;hl.fl=trans&amp;hl.qparser=lucene&amp;hl.snippets=3&amp;rows=1&amp;wt=xml):

<lst name="highlighting">
    <lst name="b952b811-3711-4bb1-ae3d-e8c8725dcfe7">
        <arr name="trans">
            <str> ... <em>Kündigung</em> ... </str>
            <str> ... <em>Kündigung</em> ... </str>
            <str> ... <em>Kündigung</em> ... </str>
        </arr>
    </lst>
</lst>

在这种情况下,hl.q 从查询本身中提取了突出显示的术语,并且做得非常好..

【问题讨论】:

  • 在不明确设置 hl.q 的情况下表现如何?
  • 没有hl.q,高亮显示正确返回结果...
  • 看起来您正在使用 zookeeper 运行多个实例。单个核心集合是否也会出现问题?

标签: solr query-parser


【解决方案1】:

您的 JVM 编码可能有问题。 -Dfile.encoding=UTF8 怎么样?也检查 LC_ALL 和 LC_CTYPE。应该是 UTF-8。

trans 字段是什么字段类型?我什至用 text_en 索引了德语文本,并且在突出显示或搜索时对变音符号没有任何问题,我也使用 LuceneQParser。

当您通过 Solr Admin UI (http://localhost:8983/solr/#/trans/query) 查询并激活 hl 复选框时,响应看起来如何?

【讨论】:

  • (1) W.r.t.编码,我明天告诉你。我不认为这是与 UTF8 相关的问题,因为我能够“搜索”UTF8 字符(Kündigung 在搜索中被替换,但在突出显示中没有)。 (2) 目前我已将解析设置为默认值。如何通过 url 将解析显式设置为“LuceneQParser”? (3) 如果我通过 Solr Admin UI 并激活复选框,则会将“&hl=on”添加到 url。就我而言,它是“&hl=true”。我已经测试了两个网址(使用“&hl=on”和“&hl=true”,结果是一样的)
  • 在上面的评论中我的意思是hl.qparser,当我谈到解析器时
  • (2) hl.qparser=lucene
  • 不错!你知道其他可用的解析器吗?
  • 将解析器设置为lucene没有解决问题
【解决方案2】:

也检查您的分析器链。当我以这种方式错误配置链时,我得到了与您描述的相同的行为:

  <fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="query">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.StopFilterFactory" format="snowball" words="lang/stopwords_de.txt" ignoreCase="true"/>
    </analyzer>
    <analyzer type="index">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.StopFilterFactory" format="snowball" words="lang/stopwords_de.txt" ignoreCase="true"/>
      <filter class="solr.GermanNormalizationFilterFactory"/>
      <filter class="solr.GermanLightStemFilterFactory"/>
    </analyzer>
  </fieldType>

GermanNormalizationFilterFactoryGermanLightStemFilterFactory 都替换了变音符号。

【讨论】:

  • 感谢配置方面的信息。这是否意味着hl.qparser 不是解决错误配置情况的选项?我认为应该可以使用不同的查询解析器来“替换/重写”查询?
  • 据我了解,无论您设置什么查询解析器,分析器配置都是至关重要的。查询解析器不会自行进行德语规范化过滤或词干提取。所以查询和索引分析必须相互适应。
  • 看起来分析仪设置正确.. 还有其他 cmets 吗?
【解决方案3】:

您需要指定的是属性,突出显示已完成。与q=trans:Zeit 类似,您将trans 指定为属性,您需要将hl.q 指定为hl.q=trans:Kündigung。然后您的请求变为:

http://localhost:8983/solr/trans/select?q=trans:Zeit&hl=true&hl.fl=trans&hl.q=trans:Kündigung&hl.snippets=3&wt=xml&rows=1

此答案由 solr 社区和支持人员 David Smiley、Stefan Matheis 和 Erick Erickson 谦虚地提出。这是代表他们的帖子。

【讨论】:

  • 恭喜,亚瑟。就是这么简单;-)
  • 谢谢伙计。您觉得如何,我们准备好选择其中一篇帖子作为“已回答”吗?
  • 当然。感谢 David Smiley、Stefan Matheis 和 Erick Erickson。
  • 您会推荐哪个答案作为最终答案?
  • 谢谢亚瑟,但我会接受你的回答。 hl.q 中缺少的字段名称导致了问题。抱歉这么晚才回复。
猜你喜欢
  • 2011-04-30
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2014-09-26
  • 1970-01-01
  • 2013-08-30
  • 2011-09-22
相关资源
最近更新 更多