Булевский запрос с Elasticsearch - PullRequest
0 голосов
/ 24 февраля 2020

В настоящее время я использую следующий запрос -

{
    "_source": [
        "title",
        "bench",
        "id_",
        "court",
        "date",
        "content"
    ],
    "size": 15,
    "from": 0,
    "query": {
        "bool": {
            "must": [
                {
                    "multi_match": {
                        "query": "the",
                        "fields": [

                            "content"
                        ], "operator": "and"
                    }
                },

            ],
            "should": {
                "multi_match": {
                    "query": "the",
                    "fields": [
                        "content.standard^2"
                    ], "operator": "and"
                }
            }
        }
    }
    ,
    "highlight": {
        "pre_tags": [
            "<tag1>"
        ],
        "post_tags": [
            "</tag1>"
        ],
        "fields": {
            "content": {}
        },
        "fragment_size": 100
    }
}

Со следующим отображением

{
    "courts_2": {
        "mappings": {
            "properties": {
                "author": {
                    "type": "text",
                    "analyzer": "my_analyzer"
                },
                "bench": {
                    "type": "text",
                    "analyzer": "my_analyzer"
                },
                "citation": {
                    "type": "text"
                },
                "content": {
                    "type": "text",
                    "fields": {
                        "standard": {
                            "type": "text"
                        }
                    },
                    "analyzer": "my_analyzer"
                },
                "court": {
                    "type": "text"
                },
                "date": {
                    "type": "text"
                },
                "id_": {
                    "type": "text"
                },
                "title": {
                    "type": "text",
                    "fields": {
                        "standard": {
                            "type": "text"
                        }
                    },
                    "analyzer": "my_analyzer"
                },
                "verdict": {
                    "type": "text"
                }
            }
        }
    }
}

Мой анализатор - анализатор Metaphone. Вот моя цель. Я хочу, чтобы точные совпадения (стандартные) отображались первыми, а затем телефонные c. Я могу добиться этого с помощью кода. Я почти уверен, что в этом есть (есть) какая-то нежелательная логика c, и я был бы очень признателен, если бы кто-то мог на нее указать.

Кроме того, я хотел бы включить поисковую логику c где пользователь может ввести поиск, например

Реал Мадрид И Барселона ИЛИ Манчестер Юнайтед. Здесь я хочу получить все документы, которые содержат «Реал Мадрид» и «Барселона» / «Манчестер Юнайтед» / Как мне добиться с помощью текущего запроса (с изменениями)?

1 Ответ

2 голосов
/ 02 марта 2020

Я не вижу побочных эффектов в вашем запросе. Что касается вашей логики поиска c, самый простой подход, вероятно, будет использовать вместо нее запрос строки запроса . По умолчанию он поддерживает логические операторы, поэтому ваш запрос может выглядеть примерно так:

{
    "_source": [
        "title",
        "bench",
        "id_",
        "court",
        "date",
        "content"
    ],
    "size": 15,
    "from": 0,
    "query": {
        "bool": {
            "must": [
                {
                    "query_string" : {
                        "query" : "Real Madrid AND Barcelona OR Manchester United",
                        "fields" : ["content", "title"],
                        "operator": "and"
                    }
                }
            ],
            "should": {
                "query_string" : {
                    "query" : "Real Madrid AND Barcelona OR Manchester United",
                    "fields" : ["content.standard", "title.standard"],
                    "boost": 2,
                    "operator": "and"
                }
            }
        }
    },
    "highlight": {
        "pre_tags": [
            "<tag1>"
        ],
        "post_tags": [
            "</tag1>"
        ],
        "fields": {
            "content": {}
        },
        "fragment_size": 100
    }
}

В противном случае вам придется анализировать запрос и моделировать операторы с несколькими запросами bool.

...