2016-09-12 31 views
5

Zaimplementowałem Solr Search i Faceting w sklepach e-commerce i napotykam na problem związany z wynikami faceting filter faceting. Dzieje się tak tylko wtedy, gdy mamy specjalny znak (tzn. Nawias) w polu aspektu, w przeciwnym razie wszystko działa poprawnie.Nieprawidłowe wyniki aspektu ze znakami specjalnymi w polu aspektu

Zaimplementowałem to za pomocą SolrNet. Sprawdziłem bezpośrednie zapytania do Solr i odkryłem, że ten problem może występować w samym Solr i nie jest związany z SolrNet.

Przykład:

Mam liczby produktów i filtrów jak następuje:

RAM (GB) 
    2 GB 
    4 GB 
    8 GB 

Memory (GB) 
    4 GB 
    8 GB 
    16 GB 

Każda z opcji facet ma pewne produkty do nich, więc nie chodzi o liczby facet.min. Poprawnie zastosowałem także tagowanie.

Teraz jeden z tych aspektów działa dobrze, podczas gdy drugi nie działa ze wspornikiem w polu aspektu.

Oto mój schemat, w którym definiuję pola aspektów.

<dynamicField name="f_*" type="string" indexed="true" stored="true" multiValued="true" required="false" /> 
<dynamicField name="pa_*" type="string" indexed="true" stored="true" multiValued="true" required="false" /> 

Facet działa poprawnie, gdy robię zapytanie o pole zaczynające się od pa_, ale nie o f_.

Zapytanie robie, w Solr:

../select?indent=on&wt=json&facet.field={!ex%3Dpa_RAM(GB)}pa_RAM(GB)&fq={!tag%3Dpa_RAM\(GB\)}pa_RAM\(GB\):2%2BGB&q=CategoryID:(1+OR+2+OR+3+OR+4)&start=0&rows=10&defType=edismax&facet.mincount=1&facet=true&spellcheck.collate=true 

Image1 enter image description here

Działa to dobrze, jak oczekiwano.

Innym zapytania:

../select?indent=on&wt=json&facet.field={!ex%3Df_Memory(GB)}f_Memory(GB)&fq={!tag%3Df_Memory\(GB\)}f_Memory\(GB\):4%2BGB&q=CategoryID:(1+OR+2+OR+3+OR+4)&start=0&rows=10&defType=edismax&facet.mincount=1&facet=true&spellcheck.collate=true 

daje następujący wynik:

Obraz 2 enter image description here

To nie działa. Jednak jeśli usuwam znak specjalny z zapytania i zindeksowanych danych, to działa dobrze.

Co więcej, zwrócona opcja aspektu jest wybrana, do której dodałem znacznik filtra. Wszystkie inne opcje aspektów nie są zwracane przez Solr.

Nie mogę ustalić, dlaczego tak się dzieje i jak to naprawić.

Każda wskazówka \ pomysł będzie świetny!

Zapoznaj tej kwerendy i Obrazy (To nie jest właściwy sposób lub idealnym rozwiązaniem)

../select?indent=on&wt=json&facet.field={!ex%3Df_Memory(GB)}f_Memory(GB)&fq={!tag%3Df_Memory(GB)}f_Memory\(GB\):4%2BGB&q=CategoryID:(1+OR+2+OR+3+OR+4)&start=0&rows=10&defType=edismax&facet.mincount=1&facet=true&spellcheck.collate=true&fl=Id,Name,f_Memory(GB) 

enter image description here

LINK. Local Parameters for Faceting

Proszę mi pomóc!

+0

Czy te wartości rzeczywiście wrócił z indeksu podczas wykonywania kwerendy? To znaczy. jeśli umieścisz tylko pole 'f_memory (GB)' na liście pól i nadal będziesz używać tego samego zapytania (części kategorii) - czy otrzymasz inne wartości niż 4 + GB w zestawie wyników? – MatsLindh

+0

@MatsLindh Proszę zobaczyć mój zaktualizowany szczegół i obrazy. –

+0

Myślę, że musisz wypróbować kodowany znak url dla zapytania –

Odpowiedz

0
  1. znaki specjalne zapytaniami SOLR (q i fq parametry) musi być uciekł jeśli trzeba szukać ich dosłownie, inaczej queryParser zakłada swoje szczególne znaczenie. (Patrz „Ucieczka znaki specjalne” w SOLR Documentation

    W przykładzie + postać nie uciekł w fq:

    {!tag=f_Memory\(GB\)}f_Memory\(GB\):4+GB 
    
  2. Zasady te uchodzące nie dotyczą Local parameters, czyli wszystko jest między {! i }

    .

    W przykładzie uniknąłeś znaków ( i ) w etykiecie znacznika. W ten sposób etykieta zdefiniowana jako {!tag=f_Memory\(GB\)} w filtrze różni się od tej Zauważony w {!ex=f_Memory+(GB)} w polu facet, więc filtr nie jest wykluczany podczas faceting i tylko dopasowane dokumenty są używane do budowania faset.

Należy napisać filtr jako:

{!tag=f_Memory(GB)}f_Memory\(GB\):4\+GB 

i aspekt jako

{!ex=f_Memory+(GB)}f_Memory+(GB) 

aby uzyskać to, czego szukasz.

Przykład pełnej poprawnej żądanie:

../select?indent=on&wt=json&facet.field={!ex%3Df_Memory(GB)}f_Memory(GB)&fq={!tag%3Df_Memory(GB)}f_Memory\(GB\):4\%2BGB&q=CategoryID:(1+OR+2+OR+3+OR+4)&start=0&rows=10&defType=edismax&facet.mincount=1&facet=true&spellcheck.collate=true 

Proste prawdziwym przykładem Testowałem lokalnie:

to dane w rdzeniu:

Zapytanie:

http://localhost:8983/solr/test/select?q=*%3A*&fl=id%2Cf_*%2Cpa_*&wt=json&indent=true 

Response:

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 1, 
    "params": { 
     "q": "*:*", 
     "indent": "true", 
     "fl": "id,f_*,pa_*", 
     "wt": "json", 
     "_": "1474529614808" 
    } 
    }, 
    "response": { 
    "numFound": 2, 
    "start": 0, 
    "docs": [ 
     { 
     "id": "1", 
     "f_Memory(GB)": [ 
      "4+GB" 
     ], 
     "pa_RAM(GB)": [ 
      "2+GB", 
      "4GB", 
      "8GB" 
     ] 
     }, 
     { 
     "id": "2", 
     "f_Memory(GB)": [ 
      "8+GB" 
     ], 
     "pa_RAM(GB)": [ 
      "4GB" 
     ] 
     } 
    ] 
    } 
} 

faceting robocza:

Zapytanie:

http://localhost:8983/solr/test/select?q=*%3A*&fq=%7B!tag%3Df_Memory(GB)%7Df_Memory%5C(GB%5C)%3A4%5C%2BGB&fl=id%2Cf_*%2Cpa_*&wt=json&indent=true&facet=true&facet.field=%7B!ex%3Df_Memory(GB)%7Df_Memory(GB) 

Response:

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 2, 
    "params": { 
     "q": "*:*", 
     "facet.field": "{!ex=f_Memory(GB)}f_Memory(GB)", 
     "indent": "true", 
     "fl": "id,f_*,pa_*", 
     "fq": "{!tag=f_Memory(GB)}f_Memory\\(GB\\):4\\+GB", 
     "wt": "json", 
     "facet": "true", 
     "_": "1474530054207" 
    } 
    }, 
    "response": { 
    "numFound": 1, 
    "start": 0, 
    "docs": [ 
     { 
     "id": "1", 
     "f_Memory(GB)": [ 
      "4+GB" 
     ], 
     "pa_RAM(GB)": [ 
      "2+GB", 
      "4GB", 
      "8GB" 
     ] 
     } 
    ] 
    }, 
    "facet_counts": { 
    "facet_queries": {}, 
    "facet_fields": { 
     "f_Memory(GB)": [ 
     "4+GB", 
     1, 
     "8+GB", 
     1 
     ] 
    }, 
    "facet_dates": {}, 
    "facet_ranges": {}, 
    "facet_intervals": {}, 
    "facet_heatmaps": {} 
    } 
} 
+0

Kiedy próbuję twojego rozwiązania, wtedy Moja "odpowiedź": {"numFound": 0, "start": 0, "docs": [] Więc to jest złe. Ja też dostaję dopasuj dane Tak jak pokazano jako ostatnie zdjęcie Moje domyślne pole wyszukiwania, takie jak " Name" –

+0

@KalpeshBoghara, spójrz na działający przykład, który dodałem. – Zac

+0

To wciąż nie działa To tak jak mój drugi obraz w moim pytaniu. –