Как выполнить поиск подстрок в эластичном поиске?

#python #python-3.x #elasticsearch

Вопрос:

Я пытаюсь выполнить эластичный поиск, чтобы выполнить поиск по подстрокам.

 response = es.search(index='salary_fulltime', body={
        'query':{
            'bool':{
                'must':[{
                        'match_phrase':{
                            'title':'sr. java developer'
                        }
                    },{
                        'match_phrase':{
                            'location':'holtsville'
                        }
                    }]
            }
        }
    })
 

В моей базе данных у меня есть такие названия, как,

 Senior Java Developer, Java Developer, Java Engineer
 

Но у меня нет таких примеров, как sr. java developer и т. Д.,

Есть ли способ, которым я могу выполнить сопоставление подстрок. Даже несмотря на то, что у меня нет Sr. индекса эластичного поиска, есть ли способ сопоставить sr. java developer его с тем, что есть в нашей базе Senior Java Developer, Java Developer, Java Engineer данных .

В настоящее время мой поиск ничему не соответствует.

 [{'_id': '484',
 '_index': 'data',
 '_score': 13.8527,
 '_source': {'title': 'Java Developer / Engineer'},
 '_type': '_doc'},
{'_id': '385',
 '_index': 'data',
 '_score': 12.527,
 '_source': {'title': 'Senior Java Developer / Engineer'},
 '_type': '_doc'},
{'_id': '433',
 '_index': 'data',
 '_score': 11.828527,
 '_source': {'title': 'Java Architect'},
 '_type': '_doc'}]
 

Комментарии:

1. Как насчет использования match вместо match_phrase ? Или, может быть, добавить slop в match_phrase? kb.objectrocket.com/elasticsearch/…

2. Не могли бы вы немного рассказать мне об slop match_phrase этом ? Не могли бы вы немного объяснить, как им пользоваться?

Ответ №1:

Предполагая, что title поле имеет тип text данных. Итак, если для text полей типа данных не определен анализатор, то elasticsearch использует стандартный анализатор. Это будет маркировано "Senior Java Developer" в

 {
  "tokens": [
    {
      "token": "senior",
      "start_offset": 0,
      "end_offset": 6,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "java",
      "start_offset": 7,
      "end_offset": 11,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "developer",
      "start_offset": 12,
      "end_offset": 21,
      "type": "<ALPHANUM>",
      "position": 2
    }
  ]
}
 

В поисковом запросе , когда вы ищете sr. java developer , это снова маркируется в sr , java , developer . Этот запрос будет соответствовать любому документу, имеющему любой из вышеперечисленных маркеров.

Вы можете просто использовать match запрос вместо запроса на совпадение фраз

 {
  "query": {
    "match": {
      "title": "sr. java developer"
    }
  }
}
 

Результатом поиска будет

 "hits": [
      {
        "_index": "67660379",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.6409958,
        "_source": {
          "title": "Java Developer"
        }
      },
      {
        "_index": "67660379",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.5403744,
        "_source": {
          "title": "Senior Java Developer"
        }
      },
      {
        "_index": "67660379",
        "_type": "_doc",
        "_id": "3",
        "_score": 0.14181954,
        "_source": {
          "title": "Java Engineer"
        }
      }
    ]
 

Обновление 1:

Вы можете использовать этот minimum_should_match параметр в запросе соответствия

 {
  "query": {
    "match": {
      "title": {
        "query": "sr. java developer",
        "minimum_should_match": "75%"
      }
    }
  }
}
 

Результатом поиска будет

 "hits": [
      {
        "_index": "67660379",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.6409958,
        "_source": {
          "title": "Java Developer"
        }
      },
      {
        "_index": "67660379",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.5403744,
        "_source": {
          "title": "Senior Java Developer"
        }
      }
    ]
 

Комментарии:

1. Я не могу использовать матч из — за некоторых условий. Если я использую match, я получаю много глупых результатов. Например, если я ищу 'lero developer' , я получаю такие значения, как Web Developer . Но если я использую match_phrase, я не получаю таких неверных результатов. Когда я проверяю баллы для себя, я получаю значения, такие как 8.828527 или 11.16 нет, по шкале 0-100%

2. Есть ли в любом случае, что я могу получить баллы в диапазоне 0-100 %, чтобы я мог выбрать, какие из них выбрать.

3. @user_12 итак , когда вы ищете sr. java developer , что вы ожидаете получить? (на основе примеров данных, которые вы привели в вопросе выше)

4. Мне просто нужно, чтобы он соответствовал разработчику java и старшему разработчику java и т. Д., С оценками в диапазоне от 0 до 100%, Но в настоящее время я не получаю оценки в этом диапазоне. Если я смогу получить соответствие 60% с java development, я смогу их выбрать. Но теперь я получаю баллы, такие как 11,8, 8,3 или 4,4 и т.д., Как вы получаете баллы в диапазоне от 0 до 1?

5. @user_12 оценка зависит от различных факторов, таких как количество документов, периодичность, длина поля. Вы можете использовать этот API объяснения, чтобы узнать больше о том, как рассчитывается оценка в ваших данных ( elastic.co/guide/en/elasticsearch/reference/current/… ). И, поскольку я проиндексировал только 3 документа в индексе, мой балл определенно будет ниже, чем у вас