Фильтр по счету с помощью Ngrams - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть строка поиска Resta, и в настоящее время мои результаты включают:

"Save at any restaurant!", 
"Save at any gas station!"

Причина в том, что мой индекс:

{
  "rewards": {
    "aliases": {},
    "mappings": {
      "_doc": {
        "properties": {
          "name": {
            "type": "text",
            "fields": {
              "name": {
                "type": "text",
                "analyzer": "ngram_analyzer"
              }
            }
          },
        }
      }
    },
    "settings": {
      "index": {
        "number_of_shards": "5",
        "provided_name": "rewards",
        "creation_date": "1555542654894",
        "analysis": {
          "filter": {
            "ngram_filter": {
              "type": "ngram",
              "min_gram": "2",
              "max_gram": "20"
            }
          },
          "analyzer": {
            "ngram_analyzer": {
              "filter": [
                "lowercase",
                "ngram_filter"
              ],
              "type": "custom",
              "tokenizer": "standard"
            }
          }
        },
        "number_of_replicas": "1",
        "uuid": "Nzf6KNHkQIeKP0HbVFK1lw",
        "version": {
          "created": "6060299"
        }
      }
    }
  }
}

, когда я смотрю на документс Save at any gas station!, конечно же, я вижу sta в виде нграммы.

{
  "_index": "rewards",
  "_type": "_doc",
  "_id": "6",
  "_version": 1,
  "found": true,
  "took": 0,
  "term_vectors": {
    "name": {
      "field_statistics": {
        "sum_doc_freq": 73,
        "doc_count": 3,
        "sum_ttf": 73
      },
      "terms": {
        "any": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 2,
              "start_offset": 8,
              "end_offset": 11
            }
          ]
        },
        "save": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 0,
              "start_offset": 0,
              "end_offset": 4
            }
          ]
        },
        "sta": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 4,
              "start_offset": 16,
              "end_offset": 23
            }
          ]
        },
      }
    }
  }
}

(для краткости я пропустил многие другие)

Используемый запрос:

{
  "bool": {
    "should": [
      {
        "multi_match": {
          "query": "restaurant",
          "fields": [
            "name",
            "category",
          ],
          "operator": "and"
        }
      }
    ]
  }
}

Когда я ищу, я возвращаю счет

["Save at any restaurant!", 1.1967528]
["Save at any gas station!", 0.7141209]

Пользователь фактически ищет Restaurant, и мне интересно, как отфильтровать или исключить результаты по счету.Кажется, я не могу найти хорошее определение оценки (кажется относительным), но как мне не показать Save at any gas station! здесь (в конце концов).

Даже если дать ему полную поисковую фразу restaurant,баллы становятся немного лучше:

["Save at any restaurant!", 1.253743]
["Save at any gas station!", 0.7141209]

1 Ответ

1 голос
/ 20 апреля 2019

Вы можете просто создать Edge-Ngram Analyzer в отображении и использовать только и только в поисковом запросе.

Что делает ngram ребраесли он создает только следующие токены, используя начальные буквы слова.

Например, re, res, rest, resta, restau, restaur, restaura, restauran, restaurant

Я добавил анализатор граничных n-грамм и заметил, что я не используюэтот анализатор в любом из полей.Я бы использовал этот анализатор только во время поискового запроса.

Это означает, что он будет искать только вышеупомянутые токены ресторана в перевернутом индексе.

Ниже приведено примерное отображение и его запрос.

Отображение

PUT <your_index_name>
{  
   "mappings":{  
      "mydocs":{  
         "properties":{  
            "name":{  
               "type":"text",
               "fields":{  
                  "name":{  
                     "type":"text",
                     "analyzer":"ngram_analyzer"
                  }
               }
            }
         }
      }
   },
   "settings":{  
      "index":{  
         "number_of_shards":"5",
         "analysis":{  
            "filter":{  
               "ngram_filter":{  
                  "type":"ngram",
                  "min_gram":"2",
                  "max_gram":"20"
               },
               "edgengram_filter":{  
                  "type":"edge_ngram",
                  "min_gram":"2",
                  "max_gram":"20"
               }
            },
            "analyzer":{  
               "ngram_analyzer":{  
                  "filter":[  
                     "lowercase",
                     "ngram_filter"
                  ],
                  "type":"custom",
                  "tokenizer":"standard"
               },
               "edgengram_analyzer":{  
                  "filter":[  
                     "lowercase",
                     "edgengram_filter"
                  ],
                  "type":"custom",
                  "tokenizer":"standard"
               }
            }
         },
         "number_of_replicas":"1"
      }
   }
}

Ниже представлен ваш запрос:

Запрос

POST <your_index_name>/_search
{  
   "query":{  
      "bool":{  
         "should":[  
            {  
               "multi_match":{  
                  "query":"restaurant",
                  "fields":[  
                     "name",
                     "category"
                  ],
                  "operator":"and",
                  "analyzer":"edgengram_analyzer"   <---- Added this
               }
            }
         ]
      }
   }
}

Вы сможете увидеть требуемый результат.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...