2010-05-11 20 views
48

Tôi muốn làm tương đương với SQL này nhưng với Solr làm kho dữ liệu của tôi.Làm cách nào để chọn giá trị trường khác nhau bằng Solr?

SELECT 
    DISTINCT txt 
FROM 
    my_table; 

Cú pháp nào sẽ buộc Solr chỉ cung cấp cho tôi giá trị khác biệt?

http://localhost:8983/solr/select?q=txt:?????&fl=txt 

EDIT: tìm kiếm Vì vậy, mặt có vẻ phù hợp, nhưng khi tôi điều tra nó, tôi nhận ra mình chỉ có một nửa chi tiết của vấn đề.

truy vấn SQL của tôi nên đã đọc ...

SELECT 
    DISTINCT SUBSTR(txt,0,3) 
FROM 
    my_table; 

Bất kỳ khả năng này với Solr?

Trả lời

2

hãy xem xét tìm kiếm mặt

66

Faceting sẽ giúp bạn có tập hợp kết quả chứa các giá trị riêng biệt cho trường.

Ví dụ:

http://localhost:8983/solr/select/?q=*%3A*&rows=0&facet=on&facet.field=txt 

Bạn sẽ nhận được một cái gì đó trở lại như thế này:

<response> 
<responseHeader><status>0</status><QTime>2</QTime></responseHeader> 
<result numFound="4" start="0"/> 
<lst name="facet_counts"> 
<lst name="facet_queries"/> 
<lst name="facet_fields"> 
    <lst name="txt"> 
     <int name="value">100</int> 
     <int name="value1">80</int> 
     <int name="value2">5</int> 
     <int name="value3">2</int> 
     <int name="value4">1</int> 
    </lst> 
</lst> 
</lst> 
</response> 

Kiểm tra wiki để biết thêm thông tin. Faceting là một phần thực sự mát mẻ của solr. Thưởng thức :)

http://wiki.apache.org/solr/SimpleFacetParameters#Facet_Fields

Lưu ý: faceting sẽ hiển thị các giá trị được lập chỉ mục, Tức là sau khi tất cả các bộ lọc đã được áp dụng. Một cách để giải quyết vấn đề này là sử dụng phương thức copyfield để bạn có thể tạo một phiên bản khía cạnh của trường txt. Bằng cách này, kết quả của bạn sẽ hiển thị giá trị ban đầu.

Hy vọng điều đó sẽ giúp .. Rất nhiều tài liệu hướng dẫn có sẵn trên wiki. Hoặc tôi đã viết một số với ảnh chụp màn hình .. mà bạn có thể kiểm tra ở đây:

http://www.craftyfella.com/2010/01/faceting-and-multifaceting-syntax-in.html

+0

Tôi đã nhận được câu trả lời này googling cho solr riêng biệt. Cần nhiều lĩnh vực mặc dù. Một cái gì đó giống như quốc gia riêng biệt, người dùng. – HMR

+0

Giải quyết trường đa bằng cách lập chỉ mục một trường đa (field1 + "." + Field2). Bây giờ tôi cần phải biết có bao nhiêu field1, field2 khác nhau. Có hơn 2 triệu trường1.field2. Sau đây đã cho tôi một gợi ý: http: //yonik.com/solr-count-distinct/ không chắc chắn làm thế nào để làm điều này mà không có json nhưng nó sẽ trông giống như: 'q = type: 1 & start = 0 & rows = 0 & json.facet = { uniquecount: "unique (field1field2_s)"} ' – HMR

4

tôi sẽ lưu trữ các chuỗi con trong một lĩnh vực khác nhau (chúng ta hãy gọi trong txt_substring), sau đó khía cạnh trên txt_substring như CraftyFella cho thấy.

Thông thường tôi muốn sử dụng n-gram tokenizer, nhưng tôi không nghĩ bạn có thể khía cạnh về điều đó.

19

Đối với số DISTINCT một phần câu hỏi của bạn, tôi nghĩ bạn có thể đang tìm Solr's field collapsing/grouping functions. Nó sẽ cho phép bạn chỉ định một trường bạn muốn kết quả duy nhất từ, tạo một nhóm trên những giá trị duy nhất và nó sẽ cho bạn thấy có bao nhiêu tài liệu là nhóm đó.

Sau đó, bạn có thể sử dụng cùng một substr được lưu trữ trong một trường riêng biệt và thu gọn trên trường đó.

+0

chính xác những gì anh ta cần. và chính xác những gì tôi cần – encodes

+1

tôi nữa! cảm ơn người đàn ông – Oussama

+0

Tùy thuộc vào loại trường, bạn có thể sử dụng các ký tự đại diện (được gắn trái). Nhưng như thường lệ, giải pháp tốt nhất với bất kỳ công nghệ chỉ mục nào là để dự đoán câu hỏi. I.E., nếu bạn biết bạn thường xuyên tìm kiếm SUBSTR (txt, 0,3), thì bạn tạo một trường trong chỉ mục được điền bởi chuỗi con đó. Nếu thay vào đó "txt" và chiều dài chuỗi con là biến, thì n-gram hoặc xử lý khác là tuyến đường tốt nhất. –

3

Sử dụng StatsComponent với tham số stats.calcdistinct để có được một danh sách các giá trị khác biệt cho một lĩnh vực nhất định:

https://cwiki.apache.org/confluence/display/solr/The+Stats+Component

Nó cũng sẽ cung cấp cho bạn số lượng các giá trị khác biệt.(Trong trường hợp các khía cạnh bạn cần phải biết đếm để yêu cầu tất cả, hoặc bạn đặt facet.limit thành một cái gì đó thực sự cao và đếm kết quả cho mình. Ngoài ra, bạn cần một trường chuỗi để làm cho các khía cạnh hoạt động theo cách bạn cần ở đây.)

http://wiki.apache.org/solr/StatsComponent là lỗi thời vì nó không bao gồm stats.calcdistinct

stats.calcdistinct có lẽ là có sẵn từ 4.7.

Ví dụ:

/select?stats=on&stats.field=region&rows=0&stats.calcdistinct=true 

"stats":{ 
    "stats_fields":{ 
    "region":{ 
     "min":"GB", 
     "max":"GB", 
     "count":20276, 
     "missing":0, 
     "distinctValues":["GB"], 
     "countDistinct":1}}}} 
1

Solr 5.1 và sau đó có Module Facet mới đã tích hợp hỗ trợ cho việc tìm kiếm các số giá trị duy nhất trong một lĩnh vực. Bạn thậm chí có thể tìm thấy số lượng giá trị duy nhất trong một trường cho mỗi nhóm của một khía cạnh và sắp xếp theo giá trị đó để tìm số lượng giá trị duy nhất cao nhất hoặc thấp nhất.

Số giá trị duy nhất trong "myfield": json.facet = {x: 'độc đáo (myfield)'}

Facet bởi trường "thể loại", và đối với từng loại, hiển thị số giá trị duy nhất trong "màu":

json.facet={ 
    cat_breakdown : { terms : { // group results by unique values of "category" 
    field : category, 
    facet : { 
     x : "unique(color)", // for each category, find the number of unique colors 
     y : "avg(price)"  // for each category, find the average price 
    } 
    }} 
} 

Đây là trong Solr 5.1 trở lên. Các chức năng khía cạnh khác như "duy nhất" được hiển thị tại http://yonik.com/solr-facet-functions/

Các vấn đề liên quan