Solr Shingle не виден в отладочном запросе
Я пытаюсь использовать Solr, чтобы найти точные совпадения по категориям в поиске пользователя (e.g. "skinny jeans" in "blue skinny jeans")
, Я использую следующее определение типа:
<fieldType name="subphrase" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
<analyzer type="index">
<charFilter class="solr.PatternReplaceCharFilterFactory"
pattern="\ "
replacement="_"/>
<tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.ShingleFilterFactory"
outputUnigrams="true"
outputUnigramsIfNoShingles="true"
tokenSeparator="_"
minShingleSize="2"
maxShingleSize="99"/>
</analyzer>
</fieldType>
Тип будет индексировать категории без токенов, заменяя только пробелы подчеркиванием. Но он будет разбивать запросы на запросы и подчеркивать их (подчеркиваниями).
То, что я пытаюсь сделать, это сопоставить опущенный запрос с индексированными категориями. На странице Solr Analysis я вижу, что замена пробелов / подчеркиваний работает как для индекса, так и для запроса, и я вижу, что запрос корректно обшивается (скриншот ниже):
Моя проблема в том, что на странице Solr Query я не вижу генерируемой черепицы, и я предполагаю, что в результате категория "джинсы скинни" не совпадает, а категория "джинсы" совпадает:(
Это вывод отладки:
{
"responseHeader": {
"status": 0,
"QTime": 1,
"params": {
"q": "name:(skinny jeans)",
"indent": "true",
"wt": "json",
"debugQuery": "true",
"_": "1464170217438"
}
},
"response": {
"numFound": 1,
"start": 0,
"docs": [
{
"id": 33,
"name": "jeans",
}
]
},
"debug": {
"rawquerystring": "name:(skinny jeans)",
"querystring": "name:(skinny jeans)",
"parsedquery": "name:skinny name:jeans",
"parsedquery_toString": "name:skinny name:jeans",
"explain": {
"33": "\n2.2143755 = product of:\n 4.428751 = sum of:\n 4.428751 = weight(name:jeans in 54) [DefaultSimilarity], result of:\n 4.428751 = score(doc=54,freq=1.0), product of:\n 0.6709952 = queryWeight, product of:\n 6.600272 = idf(docFreq=1, maxDocs=541)\n 0.10166174 = queryNorm\n 6.600272 = fieldWeight in 54, product of:\n 1.0 = tf(freq=1.0), with freq of:\n 1.0 = termFreq=1.0\n 6.600272 = idf(docFreq=1, maxDocs=541)\n 1.0 = fieldNorm(doc=54)\n 0.5 = coord(1/2)\n"
},
"QParser": "LuceneQParser"
}
}
Понятно, что параметр parsedquery не отображает дребезжащий запрос. Что мне нужно сделать, чтобы завершить процесс сопоставления черепицы запросов с индексированными значениями? Я чувствую, что я очень близок к решению этой проблемы. Любой совет приветствуется!
1 ответ
Это неполный ответ, но этого может быть достаточно, чтобы заставить вас двигаться.
1: Вы, вероятно, хотите outputUnigrams="false"
, так что вы не соответствуете категории "джинсы" по запросу "узкие джинсы"
2: Вы действительно хотите искать с кавычками, (фраза), или поле никогда не увидит больше одного токена, чтобы разобраться.
3: кажется, что вы пытаетесь сделать то же самое, что и этот человек: http://comments.gmane.org/gmane.comp.jakarta.lucene.user/34746
Этот поток выглядит так, как будто он приводит к включению PositionFilterFactory https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
Если вы используете Solr < 5.0, попробуйте указать это в конце анализа времени запроса и посмотрите, работает ли он.
К сожалению, эта фабрика фильтров была удалена в 5.0. Это единственный комментарий, который я нашел о том, что делать вместо этого: http://lucene.apache.org/core/4_10_0/analyzers-common/org/apache/lucene/analysis/position/PositionFilter.html
Я играл с autoGeneratePhraseQueries
немного, но мне еще предстоит найти другой способ предотвратить создание Solr MultiPhraseQuery.