Поиск имени на Solr

Извиняюсь, если я публикую дублированный вопрос, если да, пожалуйста, укажите мне на оригинальный вопрос.

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

Name                Search Term         Result
Thomas Alva Edison  Thomas              Match
Thomas Alva Edison  Alva                Match
Thomas Alva Edison  Edison              Match
Thomas Alva Edison  Thomas Edison       Match
Thomas Alva Edison  Thomas Alva         Match
Thomas Alva Edison  Alva Edison         Match
Thomas Alva Edison  Thomas Alva Edison  Match
Thomas Alva Edison  homas               No Match
Thomas Alva Edison  Edison Thomas       No Match
Thomas Alva Edison  homas edison        No Match
Thomas Alva Edison  homas dison         No Match

Я генерирую запросы, используя MethodName, используя весенние данные Solr. Пожалуйста, помогите мне, как я должен сформировать мою схему для индексации этих данных и какие фильтры я должен использовать?

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

2 ответа

Ваш schema.xml может быть тот, который поставляется с solr потому что уже есть поле с именем name (маркирован и проиндексирован) там следующим образом:

<field name="name" type="text_general" indexed="true" stored="true"/>

так что все, что вам нужно сделать, это создать документ по этому индексу:

curl localhost:8983/solr/collection1/update/json?commit=true -H 'Content-type:application/json' -d '
[
  {
    "id" : "1",
    "name" : "Thomas Edison"
  }
]'

Вероятно, у вас есть класс Java, представляющий структуру вашего документа более или менее следующим образом:

@SolrDocument(solrCoreName = "collection1")
public class Person {

    @Id
    private Long id;
    @Indexed
    private String name;

    // setters and getters

}

и хранилище следующим образом:

public interface PersonDao extends SolrCrudRepository<Person, Long> {

    // derivable method names here

}

для поиска по имени вы можете объявить следующий метод:

List<Person> findByName(String name);

Поскольку поле является токенизированным, оно будет искать предоставленный параметр в токене из этого поля. Это приведет к ожидаемым результатам.

Для этой довольно специфической необходимости мне не приходит в голову фильтр / токенизатор.

Что вы можете попробовать, это SurroundQueryParser (не пробовал сам)

Если это не сработает для вас настолько печально, насколько это возможно, если бы я был там, я бы подумал о настройке какого-то рода:

  • Плагин фильтра Solr, который будет производить необходимые токены (что-то похожее на фильтр Shingle)
  • Создайте файл в документе, который будет содержать только разрешенные совпадения, и используйте что-то вроде токенайзера ключевых слов для обеспечения порядка
Другие вопросы по тегам