Как генерировать предложения без префикса автозаполнения? - PullRequest
0 голосов
/ 19 июня 2010

Я хотел бы добавить автозаполнение к своим функциям тегов.

Пара вопросов:

  1. Как создать список предложений автозаполнения, который включает совпаденияи префикс, и середина строки?Например, если пользователь вводит «auto», предложения по автозаполнению должны включать такие термины, как «автозаполнение» и «автоматизация построения».используйте запятую (",") в качестве разделителя для тегов.Поэтому, когда пользователь нажимает пробел, он все еще печатает тот же тег, но когда он нажимает клавишу запятой, он начинает новый тег.Как мне это сделать?

Я использую Django, jQuery, MySQL и Solr.Каков наилучший способ реализации вышеуказанных 2 функций?

Ответы [ 2 ]

2 голосов
/ 19 января 2011

Я реализовал именно то, о чем вы спрашиваете, и это работает очень хорошо.Необходимо учитывать две проблемы:

  • Подсветка в сводках списка результатов не работает, и предлагаемый обходной путь также не работает в данном конкретном случае.
  • Если вашДокументы имеют длинные заголовки и обрезают их при отображении, есть вероятность, что вы будете соответствовать по префиксу слова, которое не отображается.Конечно, есть несколько способов справиться с этим.
  • И в будущей версии я хотел бы придать словам в начале названия немного больший вес, чем словам в конце.Это был бы один из способов смягчить предыдущий элемент.

Как и предыдущий ответ, я бы начал с той же статьи, на которую ссылается выше, но вам действительно нужен анализатор Edge NGram.То, что вы добавите, - это ТАКЖЕ делать токенизацию пробелов.

И затем вы внесете эти изменения в свой файл schema.xml.В этом примере предполагается, что у вас уже есть поле с названием «title», и это то, что вы хотели бы также отобразить.Я создаю второе поле, которое ТОЛЬКО используется для сопоставления префиксов автозаполнения.

Шаг 1. Определение типа текстового поля Edge NGram

<types>
  <!-- ... other types ... -->

  <!-- Assuming you already have this -->
  <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
    ... normal text definition ...
  </fieldType>

  <!-- Adding this -->
  <fieldType name="prefix_edge_text" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <!-- not using enablePositionIncrements="true" for now -->
      <filter class="solr.StopFilterFactory" words="stopwords.txt" />
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <!-- No need to create Edges here -->
      <!-- Don't want stopwords here -->
    </analyzer>
  </fieldType>

</types>

Шаг 2. Определение нового поля

<fields>
  <!-- ... other fields ... -->

  <!-- Assuming you already have this -->
  <field name="title" type="text" indexed="true" stored="true" multiValued="true"/>

  <!-- Adding this -->
  <field name="prefix_title" type="prefix_edge_text" indexed="true" stored="true" multiValued="true" />

</fields>

Шаг 3: Скопируйте содержимое заголовка в поле префикса во время индексации

<!-- Adding this -->
<copyField source="title" dest="prefix_title" />

Это почти то же самое для схемы.Просто запомните:

  • Когда вы выполняете обычный поиск, вы все равно выполняете поиск по обычному полю title .
  • Когда вы выполняете поиск по автозаполнению, выполняйте поискпротив prefix_title .
2 голосов
/ 19 июня 2010
  1. Используйте NGramTokenizerFactory .Используйте консоль анализа , чтобы увидеть, как она работает.Также см. эту статью (но вы бы использовали NGram вместо EdgeNGram).
  2. Не уверен, что вы подразумеваете под "тегами", но я думаю, у вас есть многозначное поле "теги", поэтому вашкод будет анализировать входные данные (разделение на ",") перед отправкой данных в Solr.
...