Построитель предикатов поиска

Я использую поиск Lucene с Sitecore 7.2 и использую построитель предикатов для поиска данных. Я включил вычисляемое поле в индекс, который является строкой. Когда я ищу в этом поле с помощью .Contains(mystring), он терпит неудачу, когда в mystring присутствует «и». Если в mystring нет "и", это работает.

Можете ли вы предложить мне что-нибудь?


person Aman B    schedule 03.07.2014    source источник
comment
Это только в случае с полем вычисляемого индекса, для обычного индексированного поля это работает нормально.   -  person Aman B    schedule 03.07.2014
comment
Вот как я добавляю поле вычисляемого индекса, это строковое значение ‹fields hint=raw:AddComputedIndexField› ‹field fieldName=area storageType=no indexType=TOKENIZED ›MyClass,MyAssembly‹/field› ‹/fields›   -  person Aman B    schedule 03.07.2014
comment
Не могли бы вы добавить сюда примеры кода?   -  person Ahmed Okour    schedule 04.07.2014
comment
Привет Ахмед, спасибо за ваш ответ. Однако я решил это сейчас.   -  person Aman B    schedule 05.07.2014


Ответы (2)


Lucene по умолчанию, когда поле и запрос обрабатываются, удаляет так называемые «стоп-слова», такие как and и the и т. д.

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

<fieldNames hint="raw:AddFieldByFieldName">
   <field fieldName="YOURFIELDNAME" storageType="YES" indexType="UN_TOKENIZED" vectorType="NO" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider">
       <analyzer type="Sitecore.ContentSearch.LuceneProvider.Analyzers.LowerCaseKeywordAnalyzer, Sitecore.ContentSearch.LuceneProvider" />
   </field>
   ...
</fieldNames>  

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

Вы можете попробовать установить для indexType значение TOKENIZED, но по-прежнему использовать LowerCaseKeywordAnalyzer в качестве другой комбинации. UN_TOKENIZED будет означать, что ваша строка будет обработана как один токен, что может быть не тем, что вам нужно.

person Stephen Pope    schedule 03.07.2014
comment
Привет Стивен, Спасибо за ваш ответ. Это то же самое поведение для вычисляемых индексов? Я использую что-то вроде этого ‹fields hint=raw:AddComputedIndexField› ‹field fieldName=area storageType=no indexType=TOKENIZED ›MyClass,MyAssembly‹/field› ‹/fields› - person Aman B; 03.07.2014
comment
Я попробовал ваше предложение, к сожалению, не повезло. Я хотел бы упомянуть одну вещь: это происходит, когда я использую построитель предикатов, следующий код работает отлично: context.GetQueryable‹CustomSearchResultItem›().Where(p =› p.area == myString ); - person Aman B; 03.07.2014
comment
Я решил это, взяв подсказку из ответа @Stephen Pope. Чтобы сделать ваше вычисляемое поле немаркированным, вы должны добавить его как raw: AddFieldByFieldName, так и AddComputedIndexField. См. ссылку ниже sitecore.net/Community/Technical-Blogs/ - person Aman B; 03.07.2014
comment
Приносим извинения, это поведение изменено в следующей версии v7.5, поэтому вам нужно определить его только в одном месте (fieldMap). Извините за беспокойство, Аман! - person Stephen Pope; 04.07.2014
comment
плюс1 за в основном ответ на вопрос! - person geedubb; 03.02.2015

Я решил это, взяв подсказку из ответа @Stephen Pope. Чтобы сделать ваше вычисляемое поле немаркированным, вы должны добавить его как в raw:AddFieldByFieldName, так и в AddComputedIndexField.

См. ссылку ниже http://www.sitecore.net/Community/Technical-Blogs/Martina-Welander-Sitecore-Blog/Posts/2013/09/Sitecore-7-Search-Tips-Computed-Fields.aspx

person Aman B    schedule 05.07.2014