2010-02-12 20 views
6

Tôi có một ứng dụng mà người dùng có thể chọn phụ tùng xe hơi. Họ chọn chiếc xe của họ và sau đó chọn các thuộc tính của xe như các khía cạnh. Sau khi họ chọn xe của họ, họ có thể chọn các khía cạnh như kích thước động cơ, ví dụ, để thu hẹp danh sách kết quả. Vấn đề là, không phải tất cả các tài liệu đều có kích thước động cơ (nó là một giá trị rỗng trong Solr), vì nó không quan trọng đối với tất cả các phần. Ví dụ, kích thước động cơ hiếm khi quan trọng đối với bộ lọc khí. Vì vậy, ngay cả khi người dùng đã chọn 3.5L cho kích thước động cơ của họ, tôi vẫn muốn hiển thị bộ lọc không khí trên màn hình như một phần có thể mà người dùng có thể chọn. tôi đã làm một số tìm kiếm và truy vấn khía cạnh sau đây hoạt động hoàn hảo:Làm cách nào để tôi tìm kiếm các khía cạnh trống trong trường đa khía cạnh đa giá trị và đồng thời trong Solr?

enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *]) 

Truy vấn này sẽ phù hợp với một trong hai 3,5 hoặc sẽ phù hợp với hồ sơ, nơi không có giá trị cho các lĩnh vực kích thước động cơ (không có giá trị có nghĩa là nó không quan trọng, và nó phù hợp với chiếc xe). Hoàn hảo ...

VẤN ĐỀ: Gần đây tôi đã tạo trường thuộc tính trường đa trường, vì vậy tôi có thể lưu trữ thuộc tính cho từng phần dưới dạng danh sách. Sau đó tôi áp dụng faceting vào nó, và nó đã làm việc tốt. Tuy nhiên, vấn đề xuất hiện khi tôi áp dụng truy vấn đã đề cập ở trên. Trong khi lựa chọn mặt động cơ thu hẹp số lượng tài liệu được hiển thị cho chỉ các tài liệu có kích thước động cơ, bản ghi (tôi cũng sử dụng bản ghi từ có nghĩa là tài liệu) có giá trị trống (tức là "") để động cơ không xuất hiện. Truy vấn tương tự ở trên không làm việc cho các khía cạnh đa giá trị giống như cách nó đã làm khi động cơ hóa là một trường có giá trị duy nhất.

Ví dụ:

<doc> 
    <str name="part">engine mount</str> 
    <arr name="enginesize"> 
    <str/> 
    <str/> 
    <str>3.5</str> 
    <str>3.5</str> 
    <str>3.5</str> 
    <str>3.5</str> 
    <str>3.5</str> 
    </arr> 
<doc> 

<doc> 
    <str name="part">engine bolt</str> 
    <arr name="enginesize"> 
    <str>6</str> 
    <str>6</str> 
    <str>6</str> 
    <str>6</str> 
    <str>6</str> 
    </arr> 
<doc> 

<doc> 
    <str name="part">air filter</str> 
    <arr name="enginesize"> 
    <str/> 
    <str/> 
    <str></str> 
    <str></str> 
    <str></str> 
    <str></str> 
    <str></str> 
    </arr> 
<doc> 

Những gì tôi đang tìm kiếm là một truy vấn mà sẽ kéo trở lại văn bản 1 và 3 ở trên khi tôi thực hiện tìm kiếm khía cạnh cho các kích thước động cơ cho 3.5. Các tài liệu đầu tiên (động cơ gắn kết) phù hợp, bởi vì nó có chứa giá trị trong một trong các lĩnh vực đa hóa "động cơ" mà tôi đang tìm kiếm (chứa 3,5 trong một trong các lĩnh vực). Tuy nhiên, tài liệu thứ ba cho bộ lọc không được trả về vì giá trị <str> trống. Tôi không muốn quay trở lại tài liệu thứ hai ở tất cả bởi vì nó không khớp với giá trị khía cạnh

tôi về cơ bản muốn có một truy vấn mà sẽ phù hợp với các giá trị chuỗi rỗng cho một khía cạnh nhất định và cũng phù hợp với giá trị thực tế, vì vậy tôi có được cả hai tài liệu được trả lại.

Có ai đó có truy vấn trả về tài liệu 1 và tài liệu 3 (khung động cơ và bộ lọc không khí), nhưng không phải tài liệu về công cụ bolt?

Tôi đã thử các sau đây mà không thành công (trong đó có một ở đầu rất của câu hỏi này):

// returns everything 
enginesize:"3.5" OR (enginesize:[* TO *]) 
// only returns document 1 
enginesize:"3.5" OR (enginesize:["" TO ""] AND -enginesize:"3.5") 
// only returns document 1 
enginesize:"3.5" OR (enginesize:"") 

tôi nhập khẩu các dữ liệu trên sử dụng một tập tin CSV, tôi đặt lĩnh vực keepEmpty=true. Tôi cố gắng thay vì bằng tay chèn một không gian vào lĩnh vực này khi tôi tạo ra các tập tin CSV (mà sẽ cung cấp cho bạn <str> </str>, thay vì trước đó, và sau đó thử lại các truy vấn Làm điều đó, tôi có kết quả như sau:.

// returns document 1 
enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *]) 
// returns all documents 
enginesize:"3.5" OR (enginesize:["" TO ""] AND -enginesize:"3.5") 
// returns all documents 
enginesize:"3.5" OR (enginesize:"") 

có ai có một truy vấn mà sẽ làm việc cho một trong hai tình huống, cho dù tôi có một không gian như giá trị trống hoặc đơn giản là không có giá trị gì cả?

Trả lời

8

làm thế nào về việc thay đổi cách bạn chỉ mục, thay vì làm thế nào bạn truy vấn?

thay vào đó cố gắng lập chỉ mục "kích thước động cơ không quan trọng" dưới dạng bản ghi trống, chỉ mục đó là "BẤT K" ".

Sau đó truy vấn của bạn chỉ đơn giản là trở thành enginesize: "3.5" OR (enginesize: CÓ)

+0

Không cần điều đó, hãy xem http://stackoverflow.com/a/35646250/13365 – neu242

1

tôi đã chỉ được chơi với điều này và tìm thấy một hint điều đó dường như làm các trick cho tôi. dịch truy vấn của bạn nó nên là:

enginesize:"3.5" OR (-enginesize:["" TO *]) 

hth,

andi


update: sau khi một số thử nghiệm nhiều hơn tôi không nghĩ rằng điều này làm việc đáng tin cậy - đối với một số chỉ số nó phải là đường tròn khác và không có dấu trừ, tức là enginesize:[* TO ""]. điều này có thể phụ thuộc vào loại chỉ mục, nếu nó có giá trị nhiều hoặc thậm chí trên các giá trị thực tế.

trong mọi trường hợp có vẻ như quá nhiều hack. tôi có thể sẽ giải quyết để thay thế các giá trị rỗng với một dấu hiệu đặc biệt ...