Искать фразу через многозначное поле SOLR - PullRequest
0 голосов
/ 06 июня 2018

Я выполняю поиск SOLR.Когда я набираю «abc def», я хочу получить все абзацы, содержащие «abc def».Например, если у меня есть эти абзацы.

{
    "paragraphs": ["abc def. bdbdbdbdbd, aa", "abd efe"]
},
{   
    "paragraphs": ["xyzabc def xyz", "fgh xx", "abcdef", "wwwabc defxxx"]
}

Я хочу получить данные из первого.Точное соответствие этой фразе, поэтому не является частью другой фразы.Если я ищу слово «бог собака», фраза «бог собака» не должна включаться в результаты.

Проблема заключается в том, что при попытке использовать запрос paragraphs : "abc def" я получаю пустые результаты.

Это часть моего schema.xml:

  <field name="paragraphs" type="text" indexed="true" stored="true" required="true" multiValued="true"/>
  <types>
    <fieldType name="text" class="solr.TextField" sortMissingLast="true" omitNorms="true">
        <analyzer type="index">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true">
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>
</types>

Я пытался использовать StandardTokenizerFactory вместо KeywordTokenizerFactory, но результат был таким же.Я могу получить данные, используя (*abc*), но возвращаются также такие элементы, как xabcz, и я не заинтересован в этом.

1 Ответ

0 голосов
/ 06 июня 2018

Вам придется отбросить KeywordTokenizer - при этом весь сохраненный текст будет сохранен в виде одного токена.

Использование WhitespaceTokenizer или StandardTokenizer должно работать, помните, что вам нужно переиндексировать после изменения цепочки анализалюбым способом (если только вы не меняете способ обработки контента для запросов).

Использование динамического поля по умолчанию *_txt (определено как StandardTokenizer с удалением только нижнего регистра и стоп-слов) и с вашими двумя документамипроиндексировано:

q=*:*

"response":{"numFound":2,"start":0,"docs":[
    {
        "paragraphs_txt":["abc def. bdbdbdbdbd, aa",
          "abd efe"],
        "id":"d696c435-2267-442d-9abe-ea754793d5cf",
        "_version_":1602547400543567872},
    {
        "paragraphs_txt":["xyzabc def xyz",
          "fgh xx",
          "abcdef",
          "wwwabc defxxx"],
        "id":"09bbba7c-b407-403c-9771-582ef23f6b56",
        "_version_":1602547400598093824}]
}}

q=paragraphcs_txt:"abc def"

"response":{"numFound":1,"start":0,"docs":[
    {
        "paragraphs_txt":["abc def. bdbdbdbdbd, aa",
          "abd efe"],
        "id":"d696c435-2267-442d-9abe-ea754793d5cf",
        "_version_":1602547400543567872}]
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...