It's a perfectly reasonable question!
The binary "in" operator can- among other things- check for the presence of a substring in a larger string:
"beef" in "ham & beef" # 1 "apple" in "ham & beef" # 0
If the left argument is a list of strings, you'll get back a list of 1s or 0s indicating whether each substring was found:
("beef","ham","apple") in "ham & beef" # (1,1,0)
If you're just asking whether "any" word is found, you can take the "max" (maximum) of the result:
max ("beef","ham","apple") in "ham & beef" # 1
max ("bone","apple","tea") in "ham & beef" # 0
Note that all these comparisons are case-sensitive! If you want a case-insensitive comparison, the easiest way is to lowercase the string you're searching and make sure all your substrings are already lowercase:
("beef","ham","apple") in "%l" format "Ham & BEEF" # (1,1,0)
Does that make sense?
For other kinds of string-searching you might want to consult the Lil reference manual on the "like" operator (which performs glob-matching with * wildcards) and the Decker reference manual on the "rtext.find[]" or "rtext.replace[]" utility functions, which retrieve the index of found words or perform substitutions, respectively. Everything in the "rtext" interface will work on a plain string, too.