Дубликаты при поиске по text_general

#search #solr #full-text-search

#Поиск #солр #полнотекстовый поиск

Вопрос:

Я использую Solr 8 и запускаю его почти с настройкой по умолчанию. Я хотел бы выполнить поиск по нескольким текстовым полям и скопировать их в _text_general_ поле.

Это часть моего managed_schema.xml:

 <field name="id" type="string" stored="true" required="true" />
<field name="p_name" type="string" indexed="true" stored="true" required="true" />
<field name="p_additional_info" type="string" indexed="true" stored="true" />
<field name="p_brand" type="string" indexed="true" stored="true" />
<field name="p_manufacturer" type="string" indexed="true" stored="true" />
<field name="p_image_link" type="string" indexed="false" stored="true" />

<uniqueKey>id</uniqueKey>

<field name="_root_" type="string" indexed="true" stored="false" docValues="false" />
<field name="_text_" type="text_general" indexed="true" stored="false" multiValued="true"/>

<!-- copy this 3 values to basic search field -->
<copyField source="p_name" dest="_text_"/>
<copyField source="p_brand" dest="_text_"/>
<copyField source="p_additional_info" dest="_text_"/>

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <filter class="solr.LowerCaseFilterFactory"/>        
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
 

Когда я пытаюсь получить результаты, q=*:* это не дает мне дубликатов. Когда я пытаюсь получить результаты с q=men помощью, я вижу следующее:

 {
  "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
      "q":"men",
      "_":"1555579368807"}},
  "response":{"numFound":9,"start":0,"docs":[
      {
        "p_additional_info":"A creme especially made for men, suitable for face, body and hands.",
        "p_name":"NIVEA MEN CREME",
        "id":"16",
        "_version_":1630705876203470848},
      {
        "p_additional_info":"A creme especially made for men, suitable for face, body and hands.",
        "p_name":"NIVEA MEN CREME",
        "id":"16",
        "_version_":1630702978343108608},
        ...            
]}}
 

У кого-нибудь есть идеи, как это решить ?..

UPD я импортирую свои документы через DIH из базы данных:

 <dataConfig>
    <dataSource name="jdbc" driver="org.postgresql.Driver" url="jdbc:postgresql://mydb.rds.amazonaws.com:5432/myapp" user="***" password="***" readOnly="true" />
    <document>
          <entity name="products"
                  query="select id, additional_info, brand, name, image_link, country, manufacturer from products"
                  dataSource="jdbc" pk="id"> 

            <field name="id" column="id" />
            <field name="p_additional_info" column="additional_info" />
            <field name="p_brand" column="brand" />
            <field name="p_name" column="name" />
            <field name="p_country" column="country" />
            <field name="p_manufacturer" column="manufacturer" />
            <field name="p_image_link" column="image_link" />

          </entity>
    </document>
</dataConfig>
 

Комментарии:

1. Здесь версия для документов отличается… это показывает, что даже если у вас есть уникальный ключ в качестве идентификатора, он не обновляет существующий документ… он добавляет другой с другой версией … в настоящее время у вас есть строковый тип для идентификатора поля… Попробуйте изменить его на целое число…

2. …также он не индексируется … сначала попробуйте сделать значение indexed равным true, а затем попробуйте использовать более поздний вариант

3. Нет , это предположение ! Тип «string» подходит для uniqueKey, а неявное значение по умолчанию для indexed свойства используется "true" как для определений field, так и для FieldType , поэтому, если ваш тип поля «string» не имеет явного indexed="false" значения, id он должен быть проиндексирован. Также помните, что не следует вносить ручные изменения в управляемую схему, а вместо этого использовать schema API.

4. @EricLavault : Да..хороший улов… Я проверил .. индексированный атрибут неявно истинен для определенных полей

5. @MatsLindh Я импортирую все данные через DIH из своей базы данных. Я обновил вопрос с помощью DIH config. Самое странное, что q=*:* не возвращает дубликатов при поиске по тексту..

Ответ №1:

Похоже, в моей managed_schema была какая-то ошибка, когда я вносил изменения вручную. После того, как я создал новый и внес изменения через schema API, как и предполагал @EricLavault, все работает правильно.