Вы можете использовать комбинацию фильтра жетона и минимум должен совпадать во время запроса:
Объяснение:
С помощью жетонного фильтра «1 2 3 4 5» можно преобразовать в этот поток токенов:
{
"tokens": [
{
"token": "1 2",
"start_offset": 0,
"end_offset": 3,
"type": "shingle",
"position": 0
},
{
"token": "2 3",
"start_offset": 2,
"end_offset": 5,
"type": "shingle",
"position": 1
},
{
"token": "3 4",
"start_offset": 4,
"end_offset": 7,
"type": "shingle",
"position": 2
},
{
"token": "4 5",
"start_offset": 6,
"end_offset": 9,
"type": "shingle",
"position": 3
}
]
}
То же самое относится и к вашему запросу.Таким образом, токен будет совпадать, только если числа находятся в правильном порядке.Использование minimu_should_match будет управлять pourcentage токена запроса, который должен совпадать в документе.
Итак, вот пример:
В отображении, которое мы настраиваемфильтр гальки и анализатор с его использованием
PUT so_54684997
{
"mappings": {
"_doc": {
"properties": {
"content": {
"type": "text",
"analyzer": "myShingledAnalyzer"
}
}
}
},
"settings": {
"analysis": {
"filter": {
"myShingle": {
"type": "shingle",
"output_unigrams": false
}
},
"analyzer": {
"myShingledAnalyzer": {
"tokenizer": "whitespace",
"filter": ["myShingle"]
}
}
}
}
}
Добавляем документ
PUT so_54684997/_doc/1
{
"content": "1 2 3 4 5"
}
Запрос 1 => Не совпадают (все числано без 4/5 в том же порядке)
POST so_54684997/_search
{
"query": {
"match": {
"content": {
"query": "2 1 3 4 5",
"minimum_should_match": "80%"
}
}
}
}
Запрос 2 => Соответствие (число 4 из 5, но в хорошем порядке)
POST so_54684997/_search
{
"query": {
"match": {
"content": {
"query": "1 2 3 4",
"minimum_should_match": "80%"
}
}
}
}
Запрос 3 => Соответствие (число 4 из 5 в том же порядке)
POST so_54684997/_search
{
"query": {
"match": {
"content": {
"query": "8 2 3 4 5",
"minimum_should_match": "80%"
}
}
}
}
Я не знаю, справится ли это со всеми вашими делами, но я думаю, что это хороший советначать !