Pertanyaan Solr - {! Ex} pada kueri faset


Latar Belakang

Saya mencoba menggabungkan 2 fitur yang berfungsi dengan sangat baik tetapi kesulitan membuatnya bekerja bersama.

* 1) Sebagaimana didokumentasikan solr wiki Saya bisa menandai fq tertentu dan kemudian mengecualikannya di facet.field saya. Itu akan membuat jumlah faset saya tetap sama bahkan ketika memilih nilai, seperti ini:

fq={!tag=pt}price:100&facet=true&facet.field={!ex=pt}price

* 2) Saya ingin menggunakan facet.query sebagai berikut:

facet=true&facet.query=price:[0 TO 100]&facet.query=price:[100 TO *]

Jadi saya ingin menggabungkan * 1 & * 2, inilah yang saya coba:

fq={!tag=pt}price:[0 to 100]&facet=true&facet.query={!ex=pt}price:[0 TO 100]&facet.query={!ex=pt}price:[100 TO *]

Apa yang sebenarnya terjadi adalah saya menerima kembali dari Solr:

<lst name="facet_queries">
    <int name="{!ex=pt}price:[0 TO 100]">8</int>
    <int name="{!ex=pt}price:[100 TO *]">19</int>
</lst>

Pertanyaanku adalah:

Mengapa bagian {! Ex = pt} dari nama itu? Ini mengacaukan beberapa logika saya. Mungkin saya menyalahgunakannya, jika demikian maka apa cara yang benar?

Informasi lebih lanjut

Apa yang saya harapkan adalah ini: (Sama seperti yang saya terima jika menjalankan * 2 tanpa * 1)

<lst name="facet_queries">
    <int name="price:[0 TO 100]">8</int>
    <int name="price:[100 TO *]">19</int>
</lst>

Itu masuk akal, karena jika saya menjalankan * 1 inilah yang saya terima di facet_fields:

<lst name="facet_fields">
    <lst name="price">
        <int name="80">8</int>
        <int name="150">19</int>
    </lst>
</lst>

Itu tidak mengatakan nama = "{! Ex = pt} harga"


7
2018-01-07 23:04


asal


Jawaban:


Saya berasumsi ini karena:

  • *1 misalnya menggunakan facet.field yang harus diberi nama dengan cara yang sama dengan bidang yang digunakannya (tanpa ada informasi yang dikecualikan).
  • *2 misalnya menggunakan facet.query yang harus mewakili query (dengan semua informasi yang mungkin digunakan dalam kueri ... tidak akan masuk akal untuk menampilkan bagian dari kueri, misalnya tanpa mengecualikan bagian)

Bagaimanapun, jika ada kebutuhan untuk menamai aspek tertentu yang menggunakan fungsi pengecualian, maka itu dapat dilakukan dengan cara berikut (menggunakan kunci parameter):

facet.field={!ex=pt key=good_name_for_a_facet}price

Hal yang sama untuk facet.query ... Misalnya, jika Anda melakukan ingin menyembunyikan bagian ex:

facet.query={!ex=pt key=$queryOne}price:[0 TO 100]

di mana queryOne merupakan bagian dari parameter baku yang diteruskan ke solr as queryOne=price:[0 TO 100]

Jadi pertanyaan terakhir akan terlihat seperti ini:

fq={!tag=pt}price:[0 TO 100]&facet=true&facet.query={!ex=pt key=$queryOne}price:[0 TO 100]&facet.query={!ex=pt key=$queryTwo}price:[100 TO *]&queryOne=price:[0 TO 100]&queryTwo=price:[100 TO *]

P. Saya telah menggunakan parameter eksternal untuk kunci, karena dengan cara itu - tidak perlu melakukan pelarian manual dari karakter khusus.


4
2018-01-08 00:49



Saya mengalami masalah ini, dan saya memecahkannya dengan menambahkan kunci param lokal ke {! Ex} param. Jadi untuk contoh Anda, saya akan melakukan:

fq = {! tag = pt} harga: [0 hingga 100] & facet = true & facet.query = {! ex = pt key = "0 TO 100"} harga: [0 TO 100] & facet.query = {! ex = pt key = "100 TO *"} harga: [100 TO *]

Alasannya adalah QueryFacet diperlakukan berbeda dari FieldFacet (facet.field vs facet.query). Solr hanya menghapus param lokal, yang merupakan {! Ex ...} dalam kunci FieldFacet. Saya benar-benar melacaknya ke kode untuk ini seperti yang Anda lihat pada baris 680 di FacetComponent.java (v 4.6) dari tautan di bawah ini:

http://svn.apache.org/viewvc/lucene/dev/tags/lucene_solr_4_6_0/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java?view=markup

Saya tidak lagi mengikuti masalah ini karena kasus penggunaan saya memerlukan kunci "cantik" tetap :)


1
2018-01-08 00:50



Beginilah cara saya memecahkannya:

for (int i = 0; i < facetQueries.size(); i++) {
    String value = facetQueries.get(i);
    query.addFacetQuery(String.format("{!ex=%s key=$fQValue_%s}%s", value, i, value));
    query.add(String.format("fQValue_%s", i), value);
}

1
2017-07-23 13:48