Nó được gọi là gì khi bạn tìm kiếm ở giữa một chuỗi thay vì bắt đầu?


19

Tôi đang cố gắng cải thiện vốn từ vựng của mình để giao tiếp tốt hơn với các nhà phát triển đồng nghiệp của mình. Chúng tôi có một vài nơi trong trang web mà chúng tôi đang tranh luận nếu chúng tôi nên tìm kiếm một chuỗi từ đầu 'running%'so với bất kỳ nơi nào trong chuỗi '%running%.

Tôi đã gọi tìm kiếm giữa là "mờ" mà tôi nhận ra là không chính xác vì mờ có nghĩa là thay đổi hình thức của từ "chạy", "chạy" [sic], "chạy" [sic].

Thuật ngữ chính xác để tìm kiếm bắt đầu của một chuỗi và tìm kiếm ở giữa một chuỗi là gì?


1
Tôi đã làm việc tại những nơi đã sử dụng "Bắt đầu với" so với "Chứa" để phân biệt giữa hai tùy chọn đó.
Solomon Rutzky

Câu trả lời:


24

Nó được gọi là "mẫu tìm kiếm không neo" và nó trông giống như trong SQL.

foo LIKE '%bar%'

Nếu bạn thiếu một %ở hai bên, người ta nói rằng mẫu tìm kiếm neo vào đầu hoặc cuối của chuỗi tương ứng. Lingo này đến từ thế giới regex.

foo LIKE 'bar%'

Bạn sẽ nói, "mẫu tìm kiếm được bar%neo vào đầu chuỗi ".

Để so sánh, PCRE được neo với ^hoặc $mã thông báo và nó trông giống như ^barhoặc bar$. PCRE yêu cầu neo rõ ràng với mã thông báo, trong khi các câu lệnh SQL LIKEđược neo hoàn toàn và yêu cầu rõ ràng %để tạo ra một "mẫu tìm kiếm không được neo" .

Là một lưu ý phụ, bạn có thể lập chỉ mục các loại biểu thức này bằng bát quái bằng cách sử dụng một cái gì đó như pg_trgmtrong PostgreQuery


1

Điều đầu tiên tôi nghĩ đến là "không thể nói được ." Tìm kiếm một chuỗi cụ thể hoặc phần đầu tiên của chuỗi trong trường được lập chỉ mục cho phép bạn tìm kiếm. Nếu tìm kiếm của bạn bắt đầu bằng ký tự đại diện, RDBMS sẽ phải quét toàn bộ chỉ mục, bởi vì các giá trị đáp ứng vị từ tìm kiếm của bạn có thể xuất hiện ở bất kỳ đâu trong bộ giá trị.

Cân nhắc tìm trong một cuốn sách điện thoại (nếu bạn đủ tuổi để nhớ chúng ...). Bạn có thể dễ dàng tìm thấy những người mà họ của họ bắt đầu bằng "Dan:" bạn đưa ngón tay cái lên D, lật về phía DA và đôi khi DAN sẽ kết hợp với nhau. Nếu bạn muốn tìm những người mà họ của họ bao gồm chuỗi "ANIEL", bạn sẽ phải đọc mọi trang (quét bảng).


2
"RDBMS sẽ phải quét toàn bộ chỉ mục" điều đó không đúng. postgresql.org/docs/9.6/static/pgtrgm.html
Evan Carroll

Tôi nghĩ rằng không thể mở rộng có thể là một thuật ngữ chung hơn so với đang được tìm kiếm ở đây vì nó bao gồm một số trường hợp khác (ví dụ tìm kiếm kết quả của một chức năng được thực hiện trên một cột).
David Spillett

0

Đó không thực sự là câu hỏi của bạn, nhưng ví dụ về sự mờ nhạt của bạn là không chính xác.

  • Fuzzy trái ngược với sắc nét, nhị phân , nghĩa là bạn có thể có tỷ lệ phần trăm 'run'trùng khớp, ví dụ: tìm kiếm mờ với độ chính xác .5 sẽ bao gồm 'ran', 'rud' và rất nhiều từ khác. SQL không hỗ trợ tìm kiếm mờ, bạn cần các hệ thống bổ sung như Lucene.
  • Một tìm kiếm ký tự đại diện'run%' sẽ luôn bao gồm 'chạy' và 'chạy' và bạn có thể phân biệt bắt đầu bằngchứa ( '%run%'để bao gồm 'vượt trội') như @ Solomon Rutzky gợi ý
  • Tuy nhiên, nếu bạn muốn tìm toàn bộ các từ , ví dụ như trong các khối văn bản, bạn sẽ cần chỉ ra khoảng trắng có trước hoặc theo dõi ' run '(hoặc ' run% 'bao gồm các phần khớp như 'bla bla runing bla' và 'bla runed bla bla').
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.