Pytanie Wyszukaj nazwę (tekst) za pomocą spacji w elastycznym wyszuku


Wyszukiwanie nazwisk (tekstów) za pomocą spacji, powodujących dla mnie problem, Mam podobne mapowanie

"{"user":{"properties":{"name":{"type":"string"}}}}"

Najlepiej, aby powrócić i uszeregować wyniki w następujący sposób

1) Bring on top names that exact match the search term (highest score)
2) Names that starts with the search term (high score)
3) Names that contains the exact search term as substring (medium score)
4) Names that contains any of the search term token  (lowest score)

Przykład W przypadku następujących nazw w wyszukiwaniu elastycznym

Maaz Tariq
Ahmed Maaz Tariq
Maaz Sheeba
Maaz Bin Tariq
Sana Tariq
Maaz Tariq Ahmed

Wyszukiwanie "Maaz Tariq", Wyniki powinny być w następującej kolejności

Maaz Tariq (highest score)
Maaz Tariq Ahmed (high score)
Ahmed Maaz Tariq (medium score)
Maaz Bin Tariq  (lowest score)
Maaz Sheeba (lowest score)
Sana Tariq (lowest score)

Czy ktokolwiek może mi wskazać, w jaki sposób i jakich analizatorów użyć? i jak uszeregować wyniki wyszukiwania dla nazw?


11
2018-05-23 08:17


pochodzenie




Odpowiedzi:


Możesz użyć typ wielu pól, a zapytanie boolowe i niestandardowe zapytanie o czynnik doładowania by rozwiązać ten problem.

Mapowanie:

{
    "mappings" : {
        "user" : {        
            "properties" : {
                "name": {
                    "type": "multi_field",
                    "fields": {
                        "name": { "type" : "string", "index": "analyzed" },
                        "exact": { "type" : "string", "index": "not_analyzed" }
                    }
                }
            }
        }
    }
}

Pytanie:

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "name": "Maaz Tariq"
                    }
                }
            ],
            "should": [
                {
                    "custom_boost_factor": {
                        "query": {
                            "term": {
                                "name.exact": "Maaz Tariq"
                            }
                        },
                        "boost_factor": 15
                    }
                },
                {
                    "custom_boost_factor": {
                        "query": {
                            "prefix": {
                                "name.exact": "Maaz Tariq"
                            }
                        },
                        "boost_factor": 10
                    }
                },
                {
                    "custom_boost_factor": {
                        "query": {
                            "match_phrase": {
                                "name": {
                                    "query": "Maaz Tariq",
                                    "slop": 0
                                }
                            }
                        },
                        "boost_factor": 5
                    }
                }
            ]
        }
    }
}

edytować:

Jak wskazał javanna, the custom_boost_factor nie jest potrzebny.

Zapytanie bez custom_boost_factor:

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "name": "Maaz Tariq"
                    }
                }
            ],
            "should": [
                {
                    "term": {
                        "name.exact": {
                            "value": "Maaz Tariq",
                            "boost": 15
                        }
                    }
                },
                {
                    "prefix": {
                        "name.exact": {
                            "value": "Maaz Tariq",
                            "boost": 10
                        }
                    }
                },
                {
                    "match_phrase": {
                        "name": {
                            "query": "Maaz Tariq",
                            "slop": 0,
                            "boost": 5
                        }
                    }
                }
            ]
        }
    }
}

9
2018-05-23 17:15



Wolałbym rozwiązanie oparte na filtrach, ale nie mogłem znaleźć odpowiedniego filtru dla 3. wymagania. - Ivaldi
Możesz po prostu utworzyć zapytanie do wyrażenia. Ponadto nie rozumiem, dlaczego potrzebujesz kwerendy custom_boost_factor. Nie możesz podać innej wagi do różnych zapytań za pomocą boost opcja? - javanna
Boost nie jest dozwolone w should sub zapytanie !? (Przynajmniej nie znam składni tego.) A jak działa filtr zapytań frazowych bez span_near zapytanie i bez match_phrase pytanie? - Ivaldi
O ile pamiętam, każde zapytanie wspomaga zwiększenie. Właściwie zapytanie frazowe jest tym, co robisz z parametrem match_phrase, nie zdawałem sobie z tego sprawy! - javanna
Próbowałem tego. Jeśli dodaję boost do pod-zapytania staje się nieważny. - Ivaldi


W przypadku Java Api, podczas kwerendy ciągów znaków za pomocą spacji;

CLIENT.prepareSearch(index)
    .setQuery(QueryBuilders.queryStringQuery(wordString)
    .field(fieldName));

W wielu innych pytaniach nic nie dostajesz jako rezultat


0
2017-07-29 17:59





A z Elasticsearch 1.0:

"title": {
    "type": "multi_field",
    "fields": {
        "title": { "type": "string" },
        "raw":   { "type": "string", "index": "not_analyzed" }
    }
}

stał się:

"title": {
    "type": "string",
    "fields": {
        "raw":   { "type": "string", "index": "not_analyzed" }
    }
}

https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html


0
2018-05-27 11:32