String search with jsonpath

jquery, json, jsonpath

Solution

Update:

According to the unit tests and this answer, you can embed a regex literal in the expression and it will be evaled. The following is the example from the unit test.

$.menu.items[?(@ && @.label && /SVG/.test(@.label))].id

So, for your example, it would be:

$.store.book[ ?( @ && @.title && /ord/.test(@.title) ) ].isbn

I've used jsonPath for some pretty large json files (2-3MB) and they were the cause of our application slow down. If you're concerned at all about performance, I'd suggest creating a supplementary index for each field the you'd like to search on. Doing this also allows you to weight the relevance value of each field, which is pretty important for getting good search results.

Or better yet, if you anticipate that your application may grow, you may want to entertain a server-side search engine (http://sphinxsearch.com/ or the SAAS version http://indexden.com/).

As for you specific problem, the like operator is supposed to be supported. However, I've been able to achieve pretty good performance with just an array of strings (eg. the titles in your data structure) and using plain javascript regex (http://www.w3schools.com/jsref/jsref_obj_regexp.asp).

Problem

I have huge JSON file with more than 20000 objects in it. I would like to query a string in this json file. However, using `jsonpath`, I could only find exact matches? Let's say my file is like: ``` { "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } } } ``` What I would like to do is: ``` jsonPath(data, "$..book[?(@.title like 'ord')]") ``` and get books having "ord" in their title. ``` { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 } ``` is it possible?

Original source

Related problems