2013-05-23 28 views
10

wyszukiwania nazwisk (tekst) ze spacjami w nim, powodując problem do mnie, mam mapowanie podobną doSzukaj nazwy (tekst) ze spacjami w elasticsearch

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

Idealnie co powinno wrócić i wyniki Rank następująco

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 do następujących nazw w elasticsearch

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

wyszukiwania dla „Maas 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) 

Może ktoś punktu mnie, jak i które Analizatory użyciu? i jak uszeregować wyniki wyszukiwania dla nazw?

Odpowiedz

8

Do rozwiązania tego problemu można użyć multi field type, bool query i custom boost factor query.

Mapowanie:

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

Zapytanie:

{ 
    "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 
        } 
       } 
      ] 
     } 
    } 
} 

edit:

Jak podkreślił javanna The custom_boost_factor nie jest potrzebne.

Query 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 
         } 
        } 
       } 
      ] 
     } 
    } 
} 
+0

bym woleć rozwiązanie oparte na filtrach, ale nie udało mi się znaleźć odpowiedniego filtru dla 3. wymagania. – Ivaldi

+0

Możesz po prostu utworzyć zapytanie do wyrażenia. Ponadto nie rozumiem, dlaczego potrzebujesz kwerendy custom_boost_factor. Czy nie możesz podać innej wagi do różnych zapytań za pomocą opcji 'boost'? – javanna

+0

'Boost'' jest niedozwolone w pytaniu "powinien' sub? (Przynajmniej nie znam składni tego.) A jak działa filtr zapytań frazowych bez zapytania 'span_near' i bez zapytania' match_phrase'? – Ivaldi

0

W przypadku Java API, gdy quering dokładnych ciągów ze spacjami w użyciu;

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

W wielu innych zapytań, można dostać nic w wyniku

Powiązane problemy