Elasti c search 2.0 поиск похожих запросов - PullRequest
0 голосов
/ 06 мая 2020

Это моя модель:

[ElasticsearchType(Name = "projectmodel")]
public class ProjectModel
{          
    public string name { get; set; }
    public string description { get; set; }
    [Nested]
    [JsonProperty("taskmodels")]
    public List<TaskModel> taskmodels { get; set; }
}

public class TaskModel
{       
    public string title { get; set; }
    public string description { get; set; }
}

Я использую следующий код для поиска внутри основного объекта и вложенного объекта.

        var searchResults = client.Search<ProjectModel>(
            body => body.Query(
                query => query.Bool(
                    bq => bq.Should(
                        q => q.Match(p => p.Field(f => f.name).Boost(6).Query(keyword)),                            
                        q => q.Match(p => p.Field(f => f.description).Boost(6).Query(keyword)),
                            sh => sh.Nested(n => n.Path(p => p.taskmodels).Query(nq => nq.Match(
                                m => m.Query(keyword).Field("taskmodels.description")

                                )
                            )
                            ),
                            sh => sh.Nested(n => n.Path(p => p.taskmodels).Query(nq => nq.Match(
                                m => m.Query(keyword).Field("taskmodels.title")

                                )
                            )
                            )
                        )

                    )
                ).Size(MAX_RESULT)
            );

Это ищет объект без каких-либо проблем. Но мне нужно ввести точное слово для searchText, чтобы получить результат.

Например: имя - «Наука и технологии»

Если я ищу с помощью технологий, он возвращает запись. Но если я искал с техно, он не вернул запись. Как я могу исправить эту проблему?

1 Ответ

1 голос
/ 06 мая 2020

Вы можете добавить match_phrase_prefix query в свое поле.

Match_phrase_prefix возьмет последний токен в вашем поисковом запросе и выполнит сопоставление префикса фразы на нем. Порядок токенов важен. Если вы хотите искать в любом месте текста, вам нужно будет создать n-граммов и edge_grams для токенов

var searchResults = _elasticClient.Search<ProjectModel>(
            body => body.Query(
                query => query.Bool(
                    bq => bq.Should(
                        q=> q.MatchPhrasePrefix(p=>p.Field(f=>f.name).Query(keyword)) --> note
                        q => q.Match(p => p.Field(f => f.name).Boost(6).Query(keyword)),
                        q => q.MatchPhrasePrefix(p => p.Field(f => f.description).Boost(6).Query(keyword)),
                            sh => sh.Nested(n => n.Path(p => p.taskmodels).Query(nq => nq.Match(
                                m => m.Query(keyword).Field("taskmodels.description")

                                )
                            )
                            ),
                            sh => sh.Nested(n => n.Path(p => p.taskmodels).Query(nq => nq.Match(
                                m => m.Query(keyword).Field("taskmodels.title")

                                )
                            )
                            )
                        )

                    )
                ).Size(MAX_RESULT)
            );

Различных между match, matchphrase и matchphraseprefix

Предположим, существует документ с полем «описание»: «наука и технология». Этот текст разбит на отдельные токены [«наука», «и», «технология»] и занесен в инвертированный индекс.

Если если вы хотите найти "наука о технологиях", вы можете использовать поисковый запрос. Порядок совпадения слов не имеет значения, поэтому вы также получите документ при поиске по запросу «наука о технологиях». Он просто сопоставляет токены.

Если порядок важен для вас, тогда используйте match_phrase «наука и технологии», только вернет документ.

Если вы хотите найти частичное предложение «наука и техника», тогда используйте match_phrase_prefix. Сопоставление префикса выполняется только для последнего токена, поэтому вы не можете искать «s cie and techno». Для этого есть другие опции, такие как граничные и графические

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