Soru Solr sorgusu (q) veya filtre sorgusu (fq)


~ 1 milyon ürün belgesi Solr indeksi var. Ayrıca kategoriler, sekmeler, fiyat aralıkları, boyutlar, renkler ve diğer bazı filtreler gibi bir sürü UI filtresine sahibim.

Herşeyi seçmenin doğru yolu bu mu? (q=\*:\*) tüm diğer filtreler fq? örnek:

fq=(catid:90 OR catid:81) AND priceEng:[38 TO 40] AND (size:39 OR size:40 OR size:41 OR size:50 OR size:72) AND (colorGroup:Yellow OR colorGroup:Violet OR colorGroup:Orange ... AND (companyId:81 OR companyId:691 OR companyId:671 OR companyId:628 OR companyId:185 OR companyId:602 OR ... AND endShipDays:[* TO 7])

Bana göre, kategorilerden şirketlere, renklerden ve boyutlardan vb. Her şey sadece filtrelerdir. Bu yaklaşımla gelecekteki büyüme performansında herhangi bir sorun var mı? Bazı sorguları q’ya koymalı mıyım?

Teşekkür ederim,


25
2017-07-24 08:57


Menşei




Cevaplar:


Mümkün olan her yerde Filtre Sorgusunu normal sorguya göre kullanmak tercih edilir.

FilterQuery avantajından yararlanabiliyor FilterCacheBu, sorgularınızla karşılaştırıldığında büyük bir performans artışı olacaktır.


41
2017-07-24 09:09



iyi fq xD içinde neredeyse her şey olabilir gibi görünüyor. Q sadece * ve uzun bir azz sorgu olarak fq olması gerçekten iyi mi? - Tommy Lord
yup ..... bu, filtre önbellekinden yararlanabilecek ve performans artışı sağlayabilecektir. - Jayendra
Ayrıca, filtre sorguları Solr puanını etkilemez. - javanna
Zayıf çalışmalar SOLR eğitiminde performans nedenleriyle AND ile birleştirilen tek bir yerine birden çok fq parametresi yapmanızı önerdiler. Böylece örnekte q = *: * ve fq = (catid: 90 OR catid: 81) ve fq = priceEng: [38 TO 40] ve fq = .... vb. - digitaljoel


Karar vermek için bir alanla ilgili aşağıdaki noktalara bakarım:

  1. Alanınızın sabit bir destek puanı var mı, yoksa bu alan için puanlamaya ihtiyacınız var mı? Evetse, sorguya koyun, çünkü yukarıda belirtildiği gibi, filtre sorgusu puanları kullanmaz.
  2. Bu alanın koşulu sıkça kullanılıyor mu? Evet ise, daha önce de belirtildiği gibi, filtre önbelleği büyük avantaj sağlayabilir, ancak eğer hayır ise daha yavaş olabilir.
  3. Endeksiniz sabit mi? Bu, # 2'ye benzer. Endeksiniz sık sık güncelleniyorsa, filtre sorgularının kullanılması performans artışı yerine bir darboğaz olabilir.

# 3 hakkında bazı notlar: Deneyimlerime göre, her birkaç saniyede yeni dokümanlar ile doldurulmuş büyük bir endeksim vardı ve autoSoftCommit de birkaç saniyeye ayarlandı. Yumuşak işlemlerde, önbellekleri geçersiz kılan yeni araştırmacı açıldı. Yani gerçekten olan şey, filtre isabet oranı neredeyse her zaman 0 idi. Daha fazlasını söyleyebilirim: İlk filtre sorgulama çalışmasının, tüm bu filtre koşullarının "fq" yerine "q" ye taşındığı bir sorgudan daha pahalı olduğunu anladım. Örneğin, "Fq" koşullarını "AND" ile ana sorguya taşıdığımda, sorgum 5 filtre sorgusu (önbellek vuruşu yok) ve 147 ms ile 1 saniye sürdü. Ancak, dizin güncellemelerini durdurduğumda, önbellek kullanıldığı için aynı filtre sorguları 0 ms aldı. Yani bu düşünülmesi gereken bir şey.

Ayrıca sorunuz için birkaç puan daha:

  • Sorgunuzda asla joker kullanmayın. Performansı önemli ölçüde etkiler. Bunun yerine ":"İstek başına daha az sabit olan bir koşulu kullanmanızı öneririm (" fq "ye koymak istediğiniz puana gerek duymayan istek başına en sabit)
  • Menzil aramaları da kaçınılması daha iyidir (eğer mümkünse). Ve aralık, joker karakterlerle daha da fazla arama yapıyor. "EndShipDays: [* TO 7]" ile ilgili. Örneğin, "endShipDays: (1 2 3 4 5 6 7)" kullanımı daha etkili olurdu, ancak bu sadece bir örnek, birçok yol var.

Umarım yardımcı olur.


7
2018-02-12 19:57





Kullandığım yol q ve fq. Tam metin araması uygularım q ve tüm filtreler fq. Alanın olduğunu söyledi anahtar kelime copyField ile şemanınızda tanımlandığı gibi alanlarla tam metin aramaya sahip olacaksınız

<copyField source="id" dest="keyword"/>
<copyField source="category" dest="keyword"/>
<copyField source="product_name" dest="keyword"/>
<copyField source="color" dest="keyword"/>
<copyField source="location" dest="keyword"/>
<copyField source="price" dest="keyword"/>
<copyField source="title" dest="keyword"/>
<copyField source="description" dest="keyword"/>

Benim sorgum benziyor

/select?q={keyword}&fq=category:fashion&fq=location:nyc

/select?q=jeans&fq=category:fashion&fq=location:nyc

Digitaljoel'in önerdiği gibi, birden fazla alan sorgulamanız gerekiyorsa, AND ve OR ile birlikte kullanmak yerine birden fazla fq'in (yukarıdaki sorguya bakın) kullanılması daha iyi olacaktır. q

Not: benim durumumda q varsayılan alanı gösterir anahtar kelime solrconfig.xml dosyasında tanımlandığı şekilde

<requestHandler name="/select" class="solr.SearchHandler">
<!-- default values for query parameters can be specified, these
     will be overridden by parameters in the request
  -->
 <lst name="defaults">
   <str name="echoParams">explicit</str>
   <int name="rows">10</int>
   <str name="df">keyword</str>
 </lst>

4
2018-03-23 07:32