2013-08-06 2 views
1

запрос: MPN: "MEM-CF-512-AOK"SOLR EdgeNGramFilter вернуть неверный ответ

Solr ответ:

{ 
"responseHeader": { 
"status": 0, 
"QTime": 1, 
"params": { 
    "fl": "id, mpn, name", 
    "indent": "true", 
    "q": "mpn:\"MEM-CF-512MB-AOK\"", 
    "_": "1375801439480", 
    "wt": "json" 
} 
}, 
"response": { 
"numFound": 2, 
"start": 0, 
"docs": [ 
    { 
    "id": "1340120", 
    "mpn": "MEM-CF-256MB-AOK", 
    "name": "256MB CompactFlash" 
    }, 
    { 
    "id": "1340129", 
    "mpn": "MEM-CF-512MB-AOK", 
    "name": "512MB CompactFlash" 
    } 
    ] 
}, 
"spellcheck": { 
    "suggestions": [ 
    "correctlySpelled", 
    true 
] 
} 
} 

ожидается:

{ 
     "id": "1340129", 
     "mpn": "MEM-CF-512MB-AOK", 
     "name": "512MB CompactFlash" 
     } 

мне нужно искать:

1) MEM-CF-512MB-AOK

2) МЭМ-МВ-512

3) МЭМ-МВ-512-АО

4) М-CF-512-АОК

5) -CF-512-АОК

schema.xml:

<field name="mpn" type="text_general_edge_ngram" indexed="true" stored="true"/> 

<fieldType name="text_general_edge_ngram" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.LowerCaseTokenizerFactory"/> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" side="front"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.LowerCaseTokenizerFactory"/> 
    </analyzer> 
</fieldType> 

ответ

2

LowercaseTokenizer - это функциональность, эквивалентная LetterTokenizer и LowercaseFilter. Судя по тому случаю, который вы предоставили, вам не нужна функция LetterTokenizer-like, которая будет индексировать только последовательные наборы букв. Фактически, перед Ngramming, у вас есть маркеры:

mem, cf, mb, aok 

Я думаю, что вы хотите это KeywordTokenizer и LowercaseFilter

Так как вы хотите, чтобы иметь возможность искать недостающие символы в конце, а также begin, вам нужно выполнить префиксный запрос. EdgeNgramTokenizer производит только NGrams принимая символы с передним, такими как:

mem-cf-512mb-aok, em-cf-512mb-aok, m-cf-512mb-aok, -cf-512mb-aok 

Таким образом, чтобы подобрать матчи с пропусками символов в конце концов, простой поиск префикса должен работать, как:

m-cf-512mb-a*

minGramSize="1" почти наверняка переусердствовал. Вы вряд ли захотите 1 грамм (т. Е. Совпадение всего "k"). Например, ваш минимальный пример выше, например, 12. Я угадаю 5 для разумного минимального размера грамма.

<analyzer type="index"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowercaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="5" maxGramSize="50" side="front"/> 
</analyzer> 
<analyzer type="query"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowercaseFilterFactory"/> 
</analyzer> 

И снова, вы должны использовать запросы, добавленные с завершающим шаблоном.

+0

я получаю сообщение об ошибке с этим: <токенизатор класс = «solr.KeywordTokenizerFactory» /> http://stackoverflow.com/a/4997599/397862 –

+0

Несомненно, небольшая ошибка копирования-вставки. Вы не можете использовать фильтр в качестве токенизатора. Может быть полезно прочитать [Solr описание Анализаторов] (http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#Analyzers) – femtoRgon

+0

извините, я новичок в solr. спасибо, запрос «mpn: * - cf-512mb-a *» отлично работает, но время запроса очень \t высокий «QTime»: 2466, Почему? –

0

сценарий вы описали выглядит как точное совпадение по mpn поле.

Однако вы определили mpn как Edge-NGram с mingram = 1. Это начнет индексировать 1 грамм вперед. Полагаю, это не то, что вам нужно.

Чтобы получить эту сортировку, я предполагаю, что у вас может быть другое поле (если вы хотите использовать NGram по другой причине), и ваш точный запрос совпадает с ним. Ex

mpn_exact:"MEM-CF-512MB-AOK" 

Вы можете проверить это с помощью компонента Анализ вашей консоли администратора.

+0

, если я использую mpn_exact с типом text_general, я не могу найти документы для этого запроса: MPN: «EM-CF-512-A» –