2016-08-17 28 views
5

Điều này có vẻ đơn giản đến mức tôi bị thuyết phục rằng tôi phải nhìn cái gì đó. Tôi không thể thiết lập cách làm như sau trong Lucene:Thuật ngữ tìm kiếm chỉ mục Sitecore Lucene với không gian khớp với một từ không có không gian

Vấn đề

  • tôi đang tìm kiếm tên địa danh.
  • Tôi có một lĩnh vực được gọi Name
  • Nó được sử dụng Lucene.Net.Analysis.Standard.StandardAnalyzer
  • Đó là TOKENIZED
  • Giá trị của Name chứa 1 không gian trong giá trị: halong bay.
  • Cụm từ tìm kiếm có thể hoặc không thể chứa thêm không gian do các cách viết khác nhau về văn hóa hoặc lỗi chính tả chính tả. Ví dụ. ha long bay thay vì halong bay.
  • Nếu tôi sử dụng cụm từ halong bay Tôi nhận được một lần truy cập.
  • Nếu tôi sử dụng cụm từ ha long bay Tôi không bị trúng.

Các giải pháp đã cố gắng

Dưới đây là đoạn code tôi đang sử dụng để xây dựng vị của tôi sử dụng LINQ to Lucene từ Sitecore:

var searchContext = ContentSearchManager.GetIndex("my_index").CreateSearchContext(); 
var term = "ha long bay"; 
var predicate = PredicateBuilder.Create<MySearchResultItemClass>(sri => sri.Name == term); 
var results = searchContext.GetQueryable<MySearchResultItemClass>().Where(predicate); 

Tôi cũng đã thử một trận đấu mờ sử dụng phần mở rộng .Like():

var predicate = PredicateBuilder.Create<MySearchResultItemClass>(sri => sri.Like(term)); 

Điều này cũng không mang lại kết quả cho ha long bay.

Làm thế nào để cấu hình Lucene trong Sitecore để trả lại một hit cho cả halong bayha long bay thuật ngữ tìm kiếm, lý tưởng mà không cần phải làm bất cứ điều gì lạ mắt với thời hạn đầu vào (ví dụ tước vũ trụ, thêm ký tự đại diện, vv)?

Lưu ý: Tôi nhận ra rằng điều này cũng sẽ cho phép cụm từ h a l o n g b a y tạo ra lần truy cập, nhưng tôi không nghĩ rằng tôi gặp sự cố với điều này.

+1

Đối với lỗi chính tả của cụm từ đó thường được sử dụng từ đồng nghĩa thay vì nhận được Logic tìm kiếm của bạn để trang trải tất cả các căn cứ. Hãy xem bài đăng này về việc thiết lập nó với Sitecore. Có thể đáng xem xét nếu bạn có nhiều loại kịch bản này - http://firebreaksice.com/sitecore-synonym-search-with-lucene/ –

+0

Cảm ơn bạn đã nói về các từ đồng nghĩa. Tôi thực sự có thể thực hiện điều đó cho các loại tìm kiếm khác. Tuy nhiên, với tâm trí của tôi, đây không phải là một từ đồng nghĩa. Đó là cùng một từ nhưng với khoảng trắng được thêm vào. Có lẽ tôi là người theo dõi, nhưng lý do để có từ đồng nghĩa là chỉ định các từ hoàn toàn khác nhau mà không có gì về mặt toán học chung, mặc dù chúng có cùng nghĩa như "nhanh" và "nhanh" không có chữ cái chung. – theyetiman

Trả lời

0

Something như thế này có thể làm các trick:

var predicate = PredicateBuilder.False<MySearchResultItemClass>(); 
foreach (var t in term.Split(' ')) 
{ 
    var tempTerm = t; 
    predicate = predicate.Or(p => p.Name.Contains(tempTerm)); 
} 
var results = searchContext.GetQueryable<MySearchResultItemClass>().Where(predicate); 

Nó tách chuỗi đầu vào của bạn, nhưng tôi đoán đó không phải là 'ưa thích';)

+0

Tôi lo ngại rằng điều này sẽ phù hợp với bất kỳ điều gì với từ "bay" hoặc "ha" hoặc "dài" mà không phải là những gì tôi sau. – theyetiman

3

Một lĩnh vực TOKENIZED có nghĩa là giá trị trường được chia cho một mã thông báo (khoảng trống trong trường hợp đó) và các thuật ngữ kết quả được thêm vào từ điển chỉ mục. Nếu bạn lập chỉ mục "halong bay" trong một trường như vậy, nó sẽ tạo ra các thuật ngữ "halong" và "bay".

Công cụ tìm kiếm không thể truy xuất kết quả này cho truy vấn tìm kiếm "ha dài" vì nó không biết bất kỳ kết quả nào với cụm từ "ha" hoặc "dài".

Cách tiếp cận thủ công sẽ là xác định tất cả các cách khác để viết tên địa điểm vào trường chỉ mục được tính toán nhiều giá trị khác có tên AlternateNames. Sau đó, bạn có thể phát hành loại truy vấn này: Name==query OR AlternateNames==query.

Cách tiếp cận tự động cũng sẽ là lập chỉ mục tên địa điểm không có dấu cách trong trường chỉ mục được tính toán riêng biệt có tên CompactName. Sau đó, bạn có thể phát hành loại truy vấn: Name==query OR CompactName==compactedQueryWithoutSpaces

Tôi hy vọng điều này sẽ giúp

Jeff

+0

Cảm ơn câu trả lời. Tôi tự hỏi nếu việc thay đổi nó thành không được phép sẽ cho phép một trận đấu được thực hiện mà không cần thao tác với thuật ngữ đầu vào? Tôi đang cố gắng để không phải viết một danh sách riêng biệt của các tên thay thế chỉ để có tài khoản của khoảng trắng. – theyetiman

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