2013-06-10 2 views
2

Если возможно, я хотел бы ограничить мои изменения кода только schema.xml и другими конфигурационными файлами. У меня есть следующий код в моем schema.xml:Solr: нечеткий оператор не меняет результаты поиска

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="title" type="text_general" indexed="true" stored="true"/> 
<field name="fact" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="body" type="text_exact_fuzzy" indexed="true" stored="true"/> 

<copyField source="title" dest="text"/> 
<copyField source="body" dest="text"/> 

Я определил text_exact_fuzzy позже в моем schema.xml следующим образом:

<text_exact_fuzzy: field type for fuzzy matching --> 
<fieldType name="text_exact_fuzzy" class="solr.TextField" omitNorms="false"> 
<analyzer type="index"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15"/> 
</analyzer> 
<analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <!-- 
    <filter class="solr.PorterStemFilterFactory"/> 
    --> 
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="true"/> 
</analyzer> 
</fieldType> 

Когда я сделать запрос в представлении Django, я использую следующий код (который принимает запрос и добавляет тильда обозначения (например, ~ 0,8) до конца каждого слова в запросе):

fuzzy_clean_text = re.sub(r'\s', '~' + str(fuzzy_index) + ' ', clean_text + ' ') 
#return fuzzy_clean_text 
post_params = [('q', re.escape(json.dumps(fuzzy_clean_text))), 
       ('wt','json'), 
       ('fl', 'fact'), 
       # I've tried the query with and without the following parameter: 
       #('spellcheck.collate', 'true'), 
      ] 
result = urllib2.urlopen(solr_server_url, urllib.urlencode(post_params)) 
response = json.loads(result.read()) 

Однако, независимо от того, как я установил fuzzy_index, запрос возвращает те же результаты. Кроме того, нечеткий поиск очень снисходителен, иногда соответствующий нерелевантный текст на конкретный fact. Есть ли другой подход, будь то через параметры запроса или изменения в файле schema.xml, который исправит проблему? Другие сообщения stackoverflow предлагают ComplexPhraseQueryParser, но я не хочу добавлять Java в свою кодовую базу (и это все равно сложно понять).

ответ

0

Я искал решение той же проблемы. Пройдя несколько документов и почтовых форумов, я понял, что в solr нет встроенного метода для достижения этого напрямую. Хотя этот метод не очень чистый и эффективный, вот как я решил эту проблему:

При создании реплики вашего запроса и добавлении к нему «~» (тильды) сохраните копию запроса без тильд и поднять его выше. Количество результатов остается неизменным, и только точные совпадения оцениваются выше.

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

Надеюсь, что это было полезно. EDIT:

$searchFields = 'firstName^40 firstName~^20'; 

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

+0

Можете ли вы отправить пример? –

 Смежные вопросы

  • Нет связанных вопросов^_^