Подсветка Solr - термины с умлаутом не найдены / не выделены

Я играю с версией 7.2 solr. Я загрузил замечательную коллекцию текстов на немецком языке и пытаюсь сделать несколько запросов.

Если я запускаю этот запрос с подсветкой:

HTTP: // локальный: 8983 / Solr / транс / д = выбрать транс: & Zeit гл = истина & hl.fl = транс & hl.q = Kundigung & hl.snippets = 3 & вес = & XML строки = 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>

То, как я интерпретирую информацию, состоит в том, что поскольку части запроса и индекса опущены, приведенный выше код должен быть одинаковым как для запроса, так и для индекса. Который... не показывает проблем с неправильной настройкой, аналогичных ответу 2 ниже...

Я вспомнил, хотя, добавив поле 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: Настройки Charset стандартной установки 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: Перезапустил solr с настройками UTF8:

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&hl=true&hl.fl=trans&hl.q=Kundigung&hl.qparser=lucene&hl.snippets=3&rows=1&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&hl=true&hl.fl=trans&hl.q=K%C3%BCndigung&hl.qparser=lucene&hl.snippets=3&rows=1&wt=xml дает:

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

uchardet all.json (file -bi all.json) отчеты UTF-8

Запуск из подсистемы Ubuntu под Windows:

$ 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.q (http://localhost:8983/solr/trans/select?q=trans:Kundigung&hl=true&hl.fl=trans&hl.qparser=lucene&hl.snippets=3&rows=1&wt=xml или же http://localhost:8983/solr/trans/select?q=trans:K%C3%BCndigung&hl=true&hl.fl=trans&hl.qparser=lucene&hl.snippets=3&rows=1&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 взял выделенные термины из самого запроса и сделал отличную работу..

3 ответа

Решение

Проверьте свою цепочку анализатора тоже. Я получаю такое же поведение, как вы описали, когда я неправильно настраиваю цепочку следующим образом:

  <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>

GermanNormalizationFilterFactory а также GermanLightStemFilterFactory оба заменяют умлауты.

Может быть проблема с кодировкой вашей JVM. Что насчет -Dfile.encoding=UTF8? Проверьте LC_ALL и LC_CTYPE тоже. Должно быть UTF-8.

Какой тип поля является транс-полем? Я даже проиндексировал немецкий текст с text_en, и у меня нет проблем с Umlauts при выделении или поиске, и я тоже использую LuceneQParser.

Как выглядит ответ при запросе через Solr Admin UI ( http://localhost:8983/solr/) и флажок hl активирован?

Вам нужно указать атрибут, для которого выполняется выделение. Похожий на q=trans:Zeitгде вы указали trans в качестве атрибута необходимо указать hl.q быть hl.q=trans:Kündigung, Ваш запрос становится:

HTTP: // локальный: 8983 / Solr / транс / д = выбрать транс: & Zeit гл = истина & hl.fl = транс & hl.q = транс:Kündigung&hl.snippets=3& вес = & XML строки = 1

Этот ответ был смиренно представлен Дэвидом Смайли, Стефаном Матеисом и Эриком Эриксоном, Solr Community and Support. Это пост от их имени.

Другие вопросы по тегам