#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 документа в индексе, мой балл определенно будет ниже, чем у вас