Okay so figured it!
I went back to ditto after seeing some other examples.
This one is a bit different as the user inputs the fields so capitals and exact matches were creating problems.
I call it like this:
{{searchform}}
[!dittofilter!]
Form code - make your own TV's and change the code below:
<form id="ajaxSearch_form" action="index.php?q=search-results.html" method="post" style="width:530px;">
<input type="hidden" name="advSearch" value="oneword" />
<div style="float:left;">
<label for="title">
Job Title:
<br/><input id="title" class="cleardefault" type="text" name="title" style="width:240px;" />
</label>
</div>
<div style="float:right;">
<label for="location">
Location:
<br/><input id="location" class="cleardefault" type="text" name="location" style="width:240px;" />
</label>
</div>
<div style="clear:both"></div>
<p/><label for="ajaxSearch_input">
Keyword:
<br/><input id="ajaxSearch_input" class="cleardefault" type="text" name="search" style="width:240px;" />
</label>
<label for="ajaxSearch_submit">
<p/><input id="ajaxSearch_submit" type="submit" name="sub" value="Search" class="searchbtn" />
</label>
</form>
Custom ditto call:
<?php
global $modx;
$filter = "";
if (!empty($_POST['title'])) $filter .= (empty($filter)?"":"|")."pagetitle,".mysql_escape_string($_POST['title']).",9";
if (!empty($_POST['location'])) $filter .= (empty($filter)?"":"|")."location,".mysql_escape_string($_POST['location']).",9";
if (!empty($_POST['search'])) $filter .= (empty($filter)?"":"|")."content,".mysql_escape_string($_POST['search']).",9";
return $modx->runSnippet('Ditto', array('parents'=>'6,7', 'tpl'=>'vacancies', 'display'=>'10', 'sortBy'=>'pub_date', 'phx'=>'-', 'paginate'=>'1', 'filter'=>$filter, 'noResults'=>'Sorry no results. Please try a broader search.'));
?>
Make yourself a TPL for the results and that's it.