To your app's hooks.py
, add the following variable. It should be a dictionary of dictionaries with the key being the DocType name, and the dictionary containing the content fields("mandatory"), the "title" field (optional, defaults to name
), and the "extras" fields (optional, defaults to []
).
frappe_search_doctypes = {
"GP Discussion": {
"content": ["content"],
"extras": ["team", "project"],
"title": "title",
}
}
What is the difference between content and extras? Content and title fields will be used when searching. Extras are fields which will be returned to you as part of the search result, but will not be used in the searching.
To build the index: go over to the Search page and click on "Index". Alternatively, run the following command:
bench --site gameplan.test execute frappe_search.core.build_index
To search: by default, the app provides a search interface to test at the Search page. You can call frappe_search.core.search
passing in query
to get search results, though.
frappe.call({
method: 'frappe_search.core.search',
args: {query: 'toykraft'},
callback: (e) => {
console.log(e.message)
}
})
// Output
{
"results": [
...
],
"duration": 16.167,
"total": 3
}
Each record will be have the following keys:
title
: original title of the recordcontent
: original content of the recordhighlighted_title
: highlighted content of the recordhighlighted_content
: highlighted content of the recorddoctype
: the DocType of the recordname
: the Frappename
value of the recordid
: unique identifier of index, a string of the format{doctype}-{name}
.addr
: the address in the Tantivy indexextras
: an object containing key value pairs of all the extra fields and values.url
: the URL to the object in Frappe Desk.
search
accepts the following two optional arguments:
target_number
: the number of results to return, defaults to 25.groupby
, defaults to false. Iftrue
(in JavaScript,True
in Python),results
will be an object, with the results grouped by doctype. The advantage with using our groupby is that each group will definitely be represented within thetarget_number
, while if you got backtarget_number
results, it might be the case that every doctype is not represented.
build_index
can have take in the following optional argument:
auto_index
: whether to automatically decide which doctypes and fields to index. By default,auto_index
is True iffrappe_search_doctypes
is not set, andFalse
if it is. If a doctype has the propertyindex_web_pages_for_search
, it will be indexed with the title fielddoctype_obj.title_field
if set, orname
; and content fields being all the doctype fields that havein_global_search
checked.
mit